Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个group()如何捕捉文本?_Java_Regex - Fatal编程技术网

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

Java 这个group()如何捕捉文本?,java,regex,Java,Regex,我遇到了这个Hackerrank问题,正则表达式应该匹配HTML标记之间的字符串。正则表达式和字符串是 String str="<h1>Hello World!</h1>"; String regex="<(.+)>([^<]+)</\\1>"; 如果我愚蠢地问这个问题,请不要介意,提前谢谢你 如果输入字符串是Hello World则由于感叹号(!)和空格字符的原因,([a-zA-z]+)将无法正确匹配 更清楚地说,以下是每个正则表达式的含

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

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");
                }
            }
        }
    }