Java正则表达式非常问题

时间:2014-06-27 18:48:54

标签: java regex

我想匹配以d开头并以a结尾的最小子字符串并包含o。

示例:" djswxaeqobdnoa" => " dnoa"

使用此代码:

Pattern pattern = Pattern.compile("d.*?o.*?a");
Matcher matcher = pattern.matcher("fondjswxaeqobdnoajezbpfrehanxi");
while (matcher.find()) {
  System.out.println(matcher.group());
}

整个输入字符串" djswxaeqobdnoa"印刷而不仅仅是" dnoa"。为什么?我怎样才能匹配最小的?

这是一个解决方案:

String shortest = null;
Pattern pattern = Pattern.compile("(?=(d.*?o.*?a))");
Matcher matcher = pattern.matcher("ondjswxaeqobdnoajezbpfrehanxi");
while (matcher.find()) {
    for (int i = 1; i <= matcher.groupCount(); i++) {
        if (shortest == null || matcher.group(i).length() < shortest.length()) {
            shortest = matcher.group(i);
        }
    }
}

4 个答案:

答案 0 :(得分:1)

djswxaeqobdnoa
d....*..o..*.a

这是正则表达式的一个匹配消耗完整String

答案 1 :(得分:0)

您正在匹配整个String,因此String调用会返回整个group

如果您想要Pattern的每个细分受众群的特定匹配项,则只需对这些细分受众群进行分组。

例如:

Pattern pattern = Pattern.compile("(d.*?)(o.*?)a");
Matcher matcher = pattern.matcher("djswxaeqobdnoa");
while (matcher.find()) {
    System.out.println(matcher.group());
    // specific groups are 1-indexed
    System.out.println(matcher.group(1));
    System.out.println(matcher.group(2));
}

<强>输出

djswxaeqobdnoa
djswxaeq
obdno

答案 2 :(得分:0)

您的正则表达式为d.*?o.*?a,您要比较的字符串为djswxaeqobdnoa

以字母d开头,并匹配下一个字符为o的最短可能性。因此它匹配从d到第一个o。由于不一致.*?,它再次匹配从o到下一个最短a的最短可能性。因此它匹配整个字符串。

答案 3 :(得分:0)

感谢您使用此代码:

String shortest = null;
Pattern pattern = Pattern.compile("(?=(d.*?o.*?a))");
Matcher matcher = pattern.matcher("ondjswxaeqobdnoajezbpfrehanxi");
while (matcher.find()) {
for (int i = 1; i <= matcher.groupCount(); i++) {
    if (shortest == null || matcher.group(i).length() < shortest.length()) {
        shortest = matcher.group(i);
    }
}

哪个更好?