为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2022-05-25 16:54:50
我遇到了这个 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");            }        }    }}不要介意我是否愚蠢地问这个问题并提前谢谢你!
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

这个正则表达式保证你的字符串只包含一个标签,假设 HTML 输入格式良好。

首字母<(.+)>捕获您的标签的名称。捕获组还将获得它可以获得的任何属性。由于+是一个贪婪的量词,如果可以的话,它将捕获多个标签。

尾随</\\1>与第一组捕获的任何内容相匹配。这就是为什么如果您的 HTML 格式正确,则表达式不会捕获多个标签或带有属性的标签:

  • 开始标签<h1>,结束标签</h1>

  • 开始标签<h1 attr="value">,结束标签</h1>,但期待</h1 attr="value">

  • 开始标签<h1><h2>,结束标签</h2></h1>,但期待</h1><h2>

这就是为什么标签可以.+相当安全地匹配,而内容必须匹配[^<]+。您要确保不抓取内容中的任何停留标签,但允许使用任何其他字符。[^<]+(发音。“不<,至少一次)允许类似的事情!,但[A-za-z]肯定不会。


查看完整回答
反对 回复 2022-05-25
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

如果输入字符串是,Hello World!([a-zA-z]+)由于感叹号 (!) 和空格字符而无法正确匹配。

更清楚地说,这是每个正则表达式的含义:

  • ([a-zA-Z]+)匹配由字母(大写或小写)组成的序列(1 个或多个字符)

  • ([^<]+)只要字符不是< 字符,就匹配一个序列(1 个或多个字符)


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信