Java 匹配器甚至不匹配循环中的 find()

Java matcher not matching even conditioned to find() in a loop

简介

我想在 Java 中使用 RegEx 提取字符串中的子字符串。为此,让我们使用 Pattern 和 Matcher 类 来正确地完成它。

代码

package stringlearning;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Jonathan
 */
public class StringLearning {

    //Example String
    public static String line = "This is the (first|second|third) choice.";


    public static void main(String[] args) 
    {

        //String is right, right?
        System.out.println("Line is: " + line);

        //How to use RegEx in Java properly
        Pattern pattern = Pattern.compile("\(([^\)]+)\)", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(line);

        //While we find, keep looping
        while(matcher.find())
        {
            //What we foud out?
            System.out.println(matcher.matches());
            System.out.println(matcher.groupCount());
            System.out.println(matcher.group(1));
        }



    }

}

问题

我还是不明白为什么它找不到任何东西。正则表达式是在 RegEx 上创建的,并在那里正常工作 (不要忘记转义!'/')

我想知道我错过了什么,它不匹配

备注

问题出在 while 循环中的这一行:

System.out.println(matcher.matches());

这里 matches() 尝试将整个区域与模式匹配。

如果匹配成功,则可以通过startendgroup方法获取更多信息。

由于您的正则表达式与整个输入不匹配,matches() returns false 您将得到 java.lang.IllegalStateException 代码调用 .group(1).

要修复,只需注释掉 System.out.println(matcher.matches()); 行并重新运行代码。

顺便说一下,您可以使用这个更短的正则表达式:

final Pattern pattern = Pattern.compile("\(([^)]+)\)");

因为不需要在字符 class 内转义 ) 并且 DOTALL 在这里是多余的,因为您没有在正则表达式中的任何地方使用 DOT。