Java 用 2 个分隔符拆分字符串

Java split string with 2 delimiters

我正在尝试使用 String.split() 拆分一些字符串。

我希望它根据字符拆分字符串:"++""+"。例如,"1 + 1" 将拆分为 {1, +, 1},而 "1 ++ 1" 将拆分为 {1, ++, 1}。我写了这一行来拆分文本:

String[] temp = tokens.split("(?<=(\++)|(\+))|(?=(\++)|(\+))");

这适用于 "1 + 1"(输出:{ 1, +, 1 }),但不适用于 "1 ++ 1"(输出:{ 1, +, +, 1 })。我知道我可以将它转换成一个 ArrayList 并找到一个 "+" 后跟一个 "+" 然后简单地将它们组合成一个标记但是我很好奇是否可以用 split()?

您可以尝试拆分具有

的零个或多个空格
  • 前面的数字和后面的运算符像 12|+ 32(我用 | 标记了这样的位置)
  • 或前面的运算符和后面的数字 12 ++|32

你的拆分看起来像

split("(?<=\d)\s*(?=[+])|(?<=[+])\s*(?=\d)")

演示:

String[] data = {"1++1" , "1 ++1", "1+ 1"};
for (String str : data){
    for (String token : str.split("(?<=\d)\s*(?=[+])|(?<=[+])\s*(?=\d)")){
        System.out.println("token: <"+token+">");
    }
    System.out.println("--------");
}

输出(我用 <> 包围了标记,以向您展示它们也去掉了空格):

token: <1>
token: <++>
token: <1>
--------
token: <1>
token: <++>
token: <1>
--------
token: <1>
token: <+>
token: <1>
--------

贪心量词对我有用:

String [] cases = { "1+1", "1++1"  };
for (String str: cases) {
  String out [] = str.split("(\+)*");
  System.out.println(Arrays.asList(out));
}

生成:

[1, , 1]
[1, , 1]

如果这还不行,那么 post 更多测试用例。