我遇到了这个 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]
肯定不会。
繁华开满天机
TA贡献1816条经验 获得超4个赞
如果输入字符串是,Hello World!
则([a-zA-z]+)
由于感叹号 (!) 和空格字符而无法正确匹配。
更清楚地说,这是每个正则表达式的含义:
([a-zA-Z]+)
匹配由字母(大写或小写)组成的序列(1 个或多个字符)([^<]+)
只要字符不是< 字符,就匹配一个序列(1 个或多个字符)
添加回答
举报
0/150
提交
取消