JSP JSTL函数fn:split无法正常工作

时间:2018-01-16 09:24:00

标签: java jsp split jstl

今天,我遇到了一个问题,需要你的帮助来解决它。

我正在尝试使用 JSTL fn:split 功能分割字符串,同样,

<c:set var="stringArrayName" value="${fn:split(element, '~$')}" />

实际字符串: - "abc~$pqr$xyz"

预期结果: -

abc 
pqr$xyz

只有2弦的部分期待,但它给出了

abc
pqr
xyz

这里,返回总共3个字符串的部分,这是错误的。

注意: - 我添加了<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> at the top of JSP.

任何帮助真的很感激!!

1 个答案:

答案 0 :(得分:1)

JSTL拆分不像Java拆分那样可以检查与代码源的区别:

org.apache.taglibs.standard.functions.Functions.split

public static String[] split(String input, String delimiters) {
    String[] array;
    if (input == null) {
        input = "";
    }
    if (input.length() == 0) {
        array = new String[1];
        array[0] = "";
        return array;
    }

    if (delimiters == null) {
        delimiters = "";
    }

    StringTokenizer tok = new StringTokenizer(input, delimiters);
    int count = tok.countTokens();
    array = new String[count];
    int i = 0;
    while (tok.hasMoreTokens()) {
        array[i++] = tok.nextToken();
    }
    return array;
}

java.lang.String.split

public String[] split(String regex, int limit) {
    return Pattern.compile(regex).split(this, limit);
}

显然,fn:split使用StringTokenizer

    ...
    StringTokenizer tok = new StringTokenizer(input, delimiters);
    int count = tok.countTokens();
    array = new String[count];
    int i = 0;
    while (tok.hasMoreTokens()) {
        array[i++] = tok.nextToken();
    }
    ...

不喜欢使用regular expression

java.lang.String.split
return Pattern.compile(regex).split(this, limit);
//-----------------------^

来自StringTokenizer documentation

  

为指定的字符串构造字符串标记生成器。 人物   在delim参数中是分隔标记的分隔符。   分隔符本身不会被视为令牌。

`fn:split`如何正常工作?

它分隔分隔符中的每个字符,在您的情况下,您有两个字符~$,所以如果您的字符串是abc~$pqr$xyz,它将像这样拆分:

abc~$pqr$xyz
   ^^   ^

第一次分裂:

abc
$pqr$xyz

第二次分裂:

abc
pqr$xyz

第3次分裂:

abc
pqr
xyz

<强>解决方案

  

在Servlet中使用split而不是JSTL

例如:

String[] array = "abc~$pqr$xyz".split("~\\$");