日期:2014-05-16  浏览次数:20307 次

【原创】关于JSTL的多数值Split不准确问题及解决方法

最近项目中需要对数据做拆分处理的问题,于是乎选择用fn:split、c:forTokens等对数据进行拆分

?

此处以split为例说明

?

1、当我们以一个字符作为分隔符的时候,我们会发现,功能很强大,拆分的数据也很正确

如:${fn:split('a;b;c',';')} 我们会得到 a b c

?

2、但当我们用多个字符作为分隔符的时候 ,问题就产生了

如:对'a!@#b#@!c!@#d'这串字符做分割处理

我们先用!@#
${fn:split(
'a!@#b#@!c!@#d','!@#')} ,数组循环后结果为 a b c d

然后我们用#@!
${fn:split(
'a!@#b#@!c!@#d','#@!')} ,数组循环后结果为 a b c d

我们发现得到的结果是一样的

?

3、我们用replace对其操作,会发现结果大大不同

${fn:replace('a!@#b#@!c!@#d','!@#',' ')} ,结果为 a b#@!c d

${fn:replace('a!@#b#@!c!@#d','#@!',' ')} ,结果为 a!@#b c!@#d


4、解决办法


那我们如何区分这种混合的情况呢,可能您现在已经想到了,那就是:

先用另外的字符替换#@!,如%^,分成数组后,在对此数组进行forTokens 的遍历分割

代码如下:

<c:set var="replacedAbs" value="${fn:replace('a!@#b#@!c!@#d','#@!','%^')}"/>
<c:forTokens items="${replacedAbs}" delims="!@#" var="splitAbs">
??????????? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${splitAbs }。<br>
</c:forTokens>


5、总结

?

c:forTokens、split? 在以分隔符切分数据时,是以单个字符分的
replace与之不同,replace在替换多字符时是连续的