在多个正则表达式

时间:2015-09-24 07:15:19

标签: java regex string

如何在这组分隔符中使用这个右括号():

第一组:

(?<=[-+*/%])
小组:

(?=[-+*/%])

我的代码是:

 String str = " (31 + 4) -6+ 1 % 7";  

 String [] result = str.split("(?<=[-+*/%])|(?=[-+*/%]) " )  ;

 System.out.println(Arrays.toString(result));

我希望这个右括号()作为括号[]中的其他字符, 同 后视断言

(?<=...)  

和前瞻断言

 (?=...) 

输出是:

   [ (31, +, 4), -, 6, +, 1, %, 7]

所需的输出:

 [ (  , 31, +, 4 ,  ) , -, 6, +, 1, %, 7]

1 个答案:

答案 0 :(得分:1)

将圆括号添加到您拥有的两个角色类可以帮助您实现所需。要删除空(仅空格)元素,可以使用.removeAll(Collections.singleton(" "))对字符串列表运行的后处理。

因此,您可以使用以下代码:

String s = " (31 + 4) -6+ 1 % 7";
String[] sp = s.split("(?<=[-+*/%()])|(?=[-+*/%()])\\s*");
List<String> list = new ArrayList<String>(Arrays.asList(sp));
list.removeAll(Collections.singleton(" "));
System.out.println(list); 

请参阅IDEONE demo

anubhava提到的另一种方式,[0-9]+|[-+*/%()]正则表达式匹配数字序列或运算符:

String s = " (31 + 4) -6+ 1 % 7";
Pattern pattern = Pattern.compile("[0-9]+|[-+*/%()]");
Matcher matcher = pattern.matcher(s);
List<String> res = new ArrayList<>();
while (matcher.find()){
    res.add(matcher.group(0));
} 

请参阅another IDEONE demo