我是正则表达式的新手,我正在尝试使用它来解析由“(”,“)”和空格分隔的标记。这是我的尝试:

String str = "(test (_bit1 _bit2 |bit3::&92;test#4|))";
String[] tokens = str.split("[\\s*[()]]");
for(int i = 0; i < tokens.length; i++)
  System.out.println(i + " : " + tokens[i]);


我期望以下输出:


  0:测试
    1:_bit1
    2:_bit2
    3:| bit3 ::&92; test#4 |


但是,实际输出中会出现两个空标记:


  0:
    1:测试
    2:
    3:_bit1
    4:_bit2
    5:|| bit3 ::&92; test#4 |


我不明白为什么我在位置0和2有两个空标记。有人可以给我提示吗?谢谢。

=====更新====

删除了Alan Moore的答案。但是我喜欢这个答案,因此我将其复制在这里供我参考。


  您的正则表达式[\ s * [()]]匹配一个空格字符(\ s)或其中一个
  字符*,(或)。开头的定界符
  字符串(()是为什么获得空的第一个标记的原因。
  那;您只需要检查一个空的第一个令牌并忽略它即可。
  
  第二个空令牌位于第一个空格和(
  跟随它。那是在您身上,因为您使用*(零个或多个)
  而不是+(一个或多个)。但是修复它并不是那么简单。你要
  分割空格,原边或两者,但是您必须确保
  至少一个字符,无论是哪个字符。这可以做到:
  
  \ s * [()] + \ s * | \ s +
  
  但是您可能也应该在括号之间留出空格:
  
  \ s *(?:[()] + \ s *)+ | \ s +
  
  作为Java字符串文字,它将是:
  
  \ s *(?:[()] + \ s *)+ | \ s +

最佳答案

我的建议是,首先从两端移除分割字符(以避免空字符串),然后进行分割。

String[] tokens = str.replaceAll("^[\\s()]+|[\\s()]+$", "").split("[\\s()]+");
                           -- replace leading or trailing--


另外,我已经将拆分字符(空格,( ))放在字符类[]

10-01 20:23
查看更多