【问题标题】:How exactly does Pattern.matcher() work? [duplicate]Pattern.matcher() 究竟是如何工作的? [复制]
【发布时间】:2018-06-25 01:57:11
【问题描述】:

所以我正在尝试创建一个解析器来匹配字符串的某些部分。字符串看起来像 f(q[group1],[group2])=(q[group3],[group4],[group5])。下面代码中的 Pattern.matches() 返回 true,但我无法通过 matcher.group(int) 访问组。提供的代码中的最后一行抛出:java.lang.IllegalStateException: No match available

public class Parser {
   Pattern pattern;
   Matcher matcher;
   String g;

public Parser(String s) {
   g = s.replaceAll("\\s+", "");
   pattern = Pattern.compile("^f\\(q(\\d+),(.)\\)=\\(q([+-]*\\d+),(.),([+-])1\\)$");
   matcher = pattern.matcher(g);
   boolean b = Pattern.matches("^f\\(q(\\d+),(.)\\)=\\(q([+-]*\\d+),(.),([+-])1\\)$",g);

 System.out.println(b +   " ");
 System.out.println(matcher.group(1));
}
}

【问题讨论】:

  • 您永远无法与matcher 匹配。我不确定您为什么要调用静态方法 Pattern.matches 但该行应为 boolean b = matcher.matches();

标签: java regex parsing pattern-matching matcher


【解决方案1】:

你永远不会匹配任何与 matcher 匹配的东西。我不确定你为什么要调用静态方法 Pattern.matches 但那行应该是

boolean b = matcher.matches();

像这样:

public class Parser {
    Pattern pattern;
    Matcher matcher;
    String g;

    public Parser(String s) {
        g = s.replaceAll("\\s+", "");
        pattern = Pattern.compile("^f\\(q(\\d+),(.)\\)=\\(q([+-]*\\d+),(.),([+-])1\\)$");
        matcher = pattern.matcher(g);
        boolean b = matcher.matches();

        System.out.println(b + " ");
        System.out.println(matcher.group(1));
    }
}

【讨论】:

  • 这是一回事,都返回true。但是,主要问题是为什么我不能通过 matcher.group(int) 访问组
  • 如果您先访问boolean b = matcher.matches();,则可以访问matcher.group(int)。您需要先在Matcher 上调用matchesfind,然后才能访问group 方法。
猜你喜欢
  • 2012-01-26
  • 2019-10-12
  • 2023-03-16
  • 2012-10-07
  • 2020-10-17
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多