正则表达式显示错误答案

时间:2015-05-04 11:47:52

标签: java regex

我有一个文本文件,其中包含一个人的信息。我写了一个正则表达式来提取一个人的年龄,即X年Y个月。

    String n="Mayur is  18 years 4 months old ";
    Pattern p=Pattern.compile("[\\d+\\s+years]+[\\d+\\s+months]+",Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(n);
    while (m.find()) {
        System.out.println(m.group(0));
    }

我收到的输出是:

r 
s  18 years 4 months o

我没有在输出中提取那些想要的字符,而是列出它们。

预期输出为:

18 years 4 Month

请注意,这些记录只有几年,有些只有几个月。

3 个答案:

答案 0 :(得分:2)

正则表达式的问题在于[\d+\s+years]匹配列表中找到的任何字符,这就是为什么在结果中r不必使用括号[] { {1}}。

这是您需要的正则表达式(\\d+\\s* years\\s*)*(\\d+\\s* months)*,使用()作为匹配组。

我将\\s+更改为\\s*,以使其符合以下情况:

Mayur is  18years 4months old 

这是 Live DEMO

修改

空字符串的问题是由匹配组之后的*量词引起的,我使用这个新的正则表达式修复了它:

(\\d+\\s* years\\s*)+|(\\d+\\s* months)+

请参阅 DEMO here

答案 1 :(得分:1)

(?:\\d+\\s+(?:years|months)\\s*){1,2}

使用它。[]不是你的想法。它是一个角色类。参见演示。

https://regex101.com/r/uE3cC4/25

答案 2 :(得分:1)

试试这个:

String n="Mayur is  18 years 4 months old ";
Pattern p=Pattern.compile("([0-9]+) years ([0-9]+) months",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(n);
while (m.find()) {
    String years = m.group(1);
    String months = m.group(2);
    System.out.println(m.group(0));
}

使用" 0"作为一个群体你可以得到整个表达。否则使用1或2可以获得值。