我想知道是否可以对分离的群体使用非贪婪的匹配策略?
我希望匹配<>
之间的内容。例如:
<a href="aabbcc"> xxx </a> <a href="aabbcc"> aabbcc </a>
我想得到最后一个aabbcc,所以我写道:
(.*)(>.*)(?<![a-zA-Z])(aabbcc)(?![a-zA-Z])(.*<.*)
我希望得到并取代最后一个&#34; aabbcc&#34;在<a>
和</a>
之间保持其他组不变,在这种情况下它起作用。
但是,它会在错误的情况下匹配aabbcc。
https://regex101.com/r/OeZDu5/1/
在这种情况下,有人能告诉我如何使用非贪婪策略或者为我提供其他解决方案吗?
答案 0 :(得分:0)
public static String replace(String s, String target, String newString) {
String regex1 = "(.*)(<.*?>)(.*)";
Pattern pattern = Pattern.compile(regex1);
Matcher matcher1 = pattern.matcher(s);
//System.out.println(s);
if (matcher1.matches()) {
String tmp1 = replace(matcher1.group(1), target, newString);
String tmp2 = replace(matcher1.group(3), target, newString);
return tmp1 + matcher1.group(2) + tmp2;
} else {
String regex2a = "(.*)(?<![a-zA-Z])(";
String regex2b = ")(?![a-zA-Z])(.*)";
String regex2 = regex2a + target + regex2b;
pattern = Pattern.compile(regex2);
Matcher matcher2 = pattern.matcher(s);
if (matcher2.matches()) {
s = replace(matcher2.group(1),target,newString) + newString + replace(matcher2.group(3),target,newString);
}
return s;
}
}
单独保留group2以保持&lt;&gt;中的字符串不变。
答案 1 :(得分:0)
试试这个例子:
String input = "<a href=\"aabbcc\"> xxx </a> <a href=\"aabbcc\"> aabbcc </a>\n"
+ "<a href=\"aa\">ppp</a><a href=\"yy\">zz</a>";
System.out.println( "--input--" );
System.out.println( input );
String regexx = "<[^>]+>.*<[^>]+>[ ]*<[^>]+>(.*)<[^>]+>";
Pattern pattern = Pattern.compile( regexx );
Matcher matcher = pattern.matcher( input );
System.out.println( "values:" );
while ( matcher.find() )
{
System.out.println( matcher.group( 1 ) );
}
希望这会对你有所帮助。