Java не жадное регулярное выражение с разделенными группами - PullRequest
0 голосов
/ 29 мая 2018

Мне было интересно, можно ли использовать не жадную стратегию сопоставления для отдельных групп?

Я хочу сопоставить что-то между <>.Например:

<a href="aabbcc"> xxx </a> <a href="aabbcc"> aabbcc </a>

Я хочу получить последний aabbcc, поэтому я написал:

(.*)(>.*)(?<![a-zA-Z])(aabbcc)(?![a-zA-Z])(.*<.*)

Я хочу получить и заменить последний «aabbcc» между <a> и </a> и оставить другие группы без изменений, это сработало в этом случае.Тем не менее, он будет соответствовать aabbcc в неправильной ситуации.https://regex101.com/r/OeZDu5/1/

Может кто-нибудь сказать мне, как использовать не жадную стратегию в этом случае, или предоставить мне другие решения?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Попробуйте этот пример:

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

Надеюсь, это поможет вам.

0 голосов
/ 29 мая 2018
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 в покое, чтобы сохранить строки в <> нетронутыми.

...