这个 group() 如何捕捉文本?

我遇到了这个 Hackerrank 问题,正则表达式应该匹配 HTML 标签之间的字符串。正则表达式和字符串是


String str="<h1>Hello World!</h1>";

String regex="<(.+)>([^<]+)</\\1>";

另外,如果“str”有多个类似的 HTML 标签,String str="<h1><h1>Hello World!</h1></h1>"以及如何([^<]+)捕获这个“str”,该怎么办。


我的问题是如何([^<]+)匹配 '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");

            }

        }

    }

}

不要介意我是否愚蠢地问这个问题并提前谢谢你!


牧羊人nacy
浏览 109回答 2
2回答

红糖糍粑

这个正则表达式保证你的字符串只包含一个标签,假设 HTML 输入格式良好。首字母<(.+)>捕获您的标签的名称。捕获组还将获得它可以获得的任何属性。由于+是一个贪婪的量词,如果可以的话,它将捕获多个标签。尾随</\\1>与第一组捕获的任何内容相匹配。这就是为什么如果您的 HTML 格式正确,则表达式不会捕获多个标签或带有属性的标签:开始标签<h1>,结束标签</h1>✓开始标签<h1 attr="value">,结束标签</h1>,但期待</h1 attr="value">开始标签<h1><h2>,结束标签</h2></h1>,但期待</h1><h2>这就是为什么标签可以.+相当安全地匹配,而内容必须匹配[^<]+。您要确保不抓取内容中的任何停留标签,但允许使用任何其他字符。[^<]+(发音。“不<,至少一次)允许类似的事情!,但[A-za-z]肯定不会。

繁华开满天机

如果输入字符串是,Hello World!则([a-zA-z]+)由于感叹号 (!) 和空格字符而无法正确匹配。更清楚地说,这是每个正则表达式的含义:([a-zA-Z]+)匹配由字母(大写或小写)组成的序列(1 个或多个字符)([^<]+)只要字符不是< 字符,就匹配一个序列(1 个或多个字符)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java