Java 这个group()如何捕捉文本?
我遇到了这个Hackerrank问题,正则表达式应该匹配HTML标记之间的字符串。正则表达式和字符串是Java 这个group()如何捕捉文本?,java,regex,Java,Regex,我遇到了这个Hackerrank问题,正则表达式应该匹配HTML标记之间的字符串。正则表达式和字符串是 String str="<h1>Hello World!</h1>"; String regex="<(.+)>([^<]+)</\\1>"; 如果我愚蠢地问这个问题,请不要介意,提前谢谢你 如果输入字符串是Hello World则由于感叹号(!)和空格字符的原因,([a-zA-z]+)将无法正确匹配 更清楚地说,以下是每个正则表达式的含
String str="<h1>Hello World!</h1>";
String regex="<(.+)>([^<]+)</\\1>";
如果我愚蠢地问这个问题,请不要介意,提前谢谢你 如果输入字符串是
Hello World代码>则由于感叹号(!)和空格字符的原因,([a-zA-z]+)
将无法正确匹配
更清楚地说,以下是每个正则表达式的含义:
([a-zA-Z]+)
匹配由字母表中的字母(大写或小写)组成的序列(1个或多个字符)
([^假设格式良好的HTML输入,此正则表达式保证字符串只包含一个标记
初始的
捕获标记的名称。捕获组还将获取它可以获取的任何属性。由于+
是一个贪婪的量词,如果可以,它将捕获多个标记
尾随的
与第一组捕获的内容匹配。这就是为什么,如果HTML格式正确,表达式将不会捕获多个标记或具有属性的标记:
- 开始标签
,结束标签
✓李>
- 开始标记
,结束标记
,但应为
- 开始标记
,结束标记
,但应为
这就是为什么标记可以与+
匹配,而内容必须与匹配的原因[^
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");
}
}
}
}