正则表达式上的String.split()* not *?

时间:2011-06-16 15:04:37

标签: java regex

由于String.split()适用于正则表达式,因此该代码段为

String s = "str?str?argh";
s.split("r?");

...产量:[, s, t, , ?, s, t, , ?, a, , g, h]

r?序列上拆分此字符串以使其生成[st, st, argh]的最优雅方法是什么?

编辑:我知道我可以逃脱有问题的?。问题是我不知道分隔符,我不想通过编写escapeGenericRegex()函数来解决这个问题。

8 个答案:

答案 0 :(得分:71)

仅使用Java SE API的一般解决方案是:

String separator = ...
s.split(Pattern.quote(separator));

quote方法返回一个将参数字符串作为文字匹配的正则表达式。

答案 1 :(得分:9)

您可以使用

StringUtils.split("?r")

来自commons-lang

答案 2 :(得分:5)

逃离?

s.split("r\\?");

答案 3 :(得分:4)

这也很完美:

public static List<String> splitNonRegex(String input, String delim)
{
    List<String> l = new ArrayList<String>();
    int offset = 0;

    while (true)
    {
        int index = input.indexOf(delim, offset);
        if (index == -1)
        {
            l.add(input.substring(offset));
            return l;
        } else
        {
            l.add(input.substring(offset, index));
            offset = (index + delim.length());
        }
    }
}

答案 4 :(得分:4)

String[] strs = str.split(Pattern.quote("r?"));

答案 5 :(得分:2)

使用Guava Splitter

  

通常通过识别分隔符序列的外观,从输入字符串中提取非重叠的子字符串。可以将此分隔符指定为单个字符,固定字符串,正则表达式或CharMatcher实例。或者,不是使用分隔符,分割器可以提取给定固定长度的相邻子串。

答案 6 :(得分:1)

可以直接使用Pattern类,将表达式定义为LITERAL,在这种情况下,将按原样对表达式进行求值(不是正则表达式)。

Pattern.compile(<literalExpression>, Pattern.LITERAL).split(<stringToBeSplitted>);

示例:

String[] splittedResult = Pattern.compile("r?", Pattern.LITERAL).split("str?str?argh");

将得到:

[st, st, argh]

答案 7 :(得分:-3)

String s = "str?str?argh";
s.split("r\?");