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

Kon*_*rus 48 java regex

由于String.split()使用正则表达式,此片段:

String s = "str?str?argh";
s.split("r?");
Run Code Online (Sandbox Code Playgroud)

...收益率: [, s, t, , ?, s, t, , ?, a, , g, h]

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

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

Ste*_*n C 78

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

String separator = ...
s.split(Pattern.quote(separator));
Run Code Online (Sandbox Code Playgroud)

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


小智 10

您可以使用

StringUtils.split("?r")
Run Code Online (Sandbox Code Playgroud)

来自commons-lang.

  • StringUtils.split()应该比String.split()快得多,因为StringUtils.split使用线性扫描分隔符,而String.split()使用正则表达式,这确实很慢 (2认同)
  • 需要注意的事项 - 根据JavaDoc,它将相邻的分隔符视为一个分隔符.在我的情况下,这是不希望的 (2认同)
  • 请注意,这接受要分割的字符列表,而不是字符串。所以这会在“?”或“r”的实例上分割字符串,而不是“r?”的实例 (2认同)
  • 这缺少第一个参数,而且无论如何都不会产生所需的输出。它分割每个字符,而不是整个字符串。使用 StringUtils.splitByWholeSeparator(s, "r?")`。 (2认同)

Eti*_*tel 5

逃离?:

s.split("r\\?");
Run Code Online (Sandbox Code Playgroud)

  • @dvhh我的回答是_before_编辑. (4认同)
  • 问了一个更通用的解决方案 (2认同)

Mar*_*aux 5

这也很完美:

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)