使用正则表达式匹配和分组表达式的每个术语和运算符

时间:2017-03-06 19:16:32

标签: java regex

我搜索了几个帖子,试图找出一种方法来检索每个术语和表达式的运算符,如下所示:

`now`+`1 day`-`2 days`

对于这个表达式,我想要有5个组:现在,+,1天, - ,2天。

我提出的正则表达式如下:

`(never|now|\d+\s+(?:millisecond|second|minute|hour|day|year)s?)`(?:\s*(\+|\-)\s*`(never|now|\d+\s+(?:millisecond|second|minute|hour|day|year)s?)`)*

然而,有了这个正则表达式,我只得到三组:现在, - ,2天。为了获得表达式中的每个术语和运算符,我应该做出哪些更改?请考虑表达式应包含 n 术语和 n-1 运算符实例。

非常感谢你的帮助!干杯!

3 个答案:

答案 0 :(得分:1)

使用Java的String拆分方法会更容易:http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-

例如:

String blah = "`now`+`1 day`-`2 days`";
String[] blahArray = blah.split("`");

blahArray将包含:[“”,“now”,“+”,“1天”,“ - ”,“2天”]

答案 1 :(得分:0)

正则表达式可以匹配您询问的术语,但是他们无法按照您的要求捕获组。

当捕获组包含在重复模式中时,它们捕获组将仅包含它匹配的最后一个字符串。

示例: (\d)+将匹配0123,第一个捕获组中将包含3

使用java,你可以在循环中使用诸如find之类的东西沿着你的字符串走。 Find example

答案 2 :(得分:0)

如果支持超过+-,只需在两个字符类中添加操作数,那么这应该可以完成工作:

String input = "`now`+`1 day`-`2 days`";
String pattern = "[+-]|[^+-]*";
Matcher matcher = Pattern.compile(pattern).matcher(input);
while (matcher.find()) {
    System.out.println(matcher.group().replace('`', ' ').trim());
}

打印

now
+
1 day
-
2 days