我想匹配以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);
}
}
}
答案 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);
}
}
哪个更好?