我是正则表达式的新手,我正在尝试使用它来解析由“(”,“)”和空格分隔的标记。这是我的尝试:
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--
另外,我已经将拆分字符(空格,
(
)
)放在字符类[]
中