Как эта группа () ловит текст? - PullRequest
0 голосов
/ 30 января 2019

Я столкнулся с этой проблемой Hackerrank, и регулярное выражение должно соответствовать строке между тегами HTML.Регулярное выражение и строка:

String str="<h1>Hello World!</h1>";
String regex="<(.+)>([^<]+)</\\1>";

А что, если у 'str' есть несколько тегов HTML, например String str="<h1><h1>Hello World!</h1></h1>", и как ([^<]+) ловит эту 'str'.

Myвопрос в том, как ([^<]+) соответствует 'str', а не ([a-zA-Z]+).

Здесь, если полный исходный код:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* Solution assumes we can't have the symbol "<" as text between tags */
public class Solution{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int testCases = Integer.parseInt(scan.nextLine());

        while (testCases-- > 0) {
            String line = scan.nextLine();

            boolean matchFound = false;
            Pattern r = Pattern.compile(regex);
            Matcher m = r.matcher(line);

            while (m.find()) {
                System.out.println(m.group(2));
                matchFound = true;
            }
            if ( ! matchFound) {
                System.out.println("None");
            }
        }
    }
}

Не против, если я глуп, чтобы спроситьэтот вопрос и спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Это регулярное выражение гарантирует, что ваша строка содержит только один тег, при условии правильного ввода HTML.

Начальный <(.+)> фиксирует имя вашего тега.Группа захвата также получит все возможные атрибуты.Поскольку + является жадным квантификатором, он может захватить несколько тегов, если сможет.

Трейлинг </\\1> совпадает с тем, что захватила первая группа.Вот почему, если ваш HTML правильно сформирован, выражение не будет захватывать несколько тегов или тегов с атрибутами:

  • Открывающий тег <h1>, закрывающий тег </h1>
  • Открывающий тег <h1 attr="value">, закрывающий тег </h1>, но ожидающий </h1 attr="value">
  • Открывающий тег <h1><h2>, закрывающий тег </h2></h1>, но ожидающий </h1><h2>

То естьпочему тег может совпадать с .+ довольно безопасно, в то время как содержимое должно совпадать с [^<]+.Вы хотите убедиться, что вы не захватываете какие-либо теги пребывания в контенте, но любой другой символ вообще разрешен.[^<]+ (произносится "не <, по крайней мере, один раз) допускает такие вещи, как !, тогда как [A-za-z] определенно не будет.

0 голосов
/ 30 января 2019

Если входная строка равна Hello World!, то ([a-zA-z]+) не будет соответствовать должным образом из-за восклицательного знака (!) И пробелов.

Чтобы быть более понятным, вот что означает каждое регулярное выражение:

  • ([a-zA-Z]+) Соответствует последовательности (1 или более символов), состоящей из букв алфавита (верхнего или нижнего регистра)

  • ([^<]+) Соответствует последовательности (1 или более символов), если символ не является a <символ </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...