带有分隔组的Java非贪婪正则表达式

时间:2018-05-29 04:08:04

标签: java regex regex-greedy

我想知道是否可以对分离的群体使用非贪婪的匹配策略?

我希望匹配<>之间的内容。例如:

<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/

在这种情况下,有人能告诉我如何使用非贪婪策略或者为我提供其他解决方案吗?

2 个答案:

答案 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 ) );
    }

希望这会对你有所帮助。