java正则表达式量词

时间:2012-02-09 07:06:45

标签: java regex

我有一个像

这样的字符串
String string = "number0 foobar number1 foofoo number2 bar bar bar bar number3 foobar";

我需要一个正则表达式给我以下输出:

number0 foobar
number1 foofoo
number2 bar bar bar bar
number3 foobar

我试过了

Pattern pattern = Pattern.compile("number\\d+(.*)(number\\d+)?");
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
    System.out.println(matcher.group());
}

但这给出了

number0 foobar number1 foofoo number2 bar bar bar bar number3 foobar

6 个答案:

答案 0 :(得分:10)

所以你希望number(+一个整数)后跟任何东西,直到下一个number(或字符串的结尾),对吗?

然后你需要告诉正则表达式引擎:

Pattern pattern = Pattern.compile("number\\d+(?:(?!number).)*");

在你的正则表达式中,.*尽可能多地匹配 - 直到字符串结尾的所有内容。此外,您将第二部分(number\\d+)?作为匹配本身的一部分。

解释我的解决方案:

number    # Match "number"
\d+       # Match one of more digits
(?:       # Match...
 (?!      #  (as long as we're not right at the start of the text
  number  #   "number"
 )        #  )
 .        # any character
)*        # Repeat as needed.

答案 1 :(得分:0)

因为.*是一种贪婪的模式。使用.*?代替.*

Pattern pattern = Pattern.compile("number\\d+(.*?)(number\\d+)");
Matcher matcher = pattern.matcher(string);
while(matcher.find();){
    out(matcher.group());
}

答案 2 :(得分:0)

如果“foobar”只是一个例子而且你的意思是“任何单词”使用以下模式:(number\\d+)\s+(\\w+)

答案 3 :(得分:0)

为什么不匹配number\\d+,查询匹配位置,自己进行字符串拆分?

答案 4 :(得分:0)

Pattern pattern = Pattern.compile("\\w+\\d(\\s\\w+)\1*");
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group());
}

答案 5 :(得分:-1)

(.*)正则表达式的一部分是贪婪的,因此它会吃掉从该点到字符串末尾的所有内容。更改为非贪婪变体:(.*)?

http://docs.oracle.com/javase/tutorial/essential/regex/quant.html