【问题标题】:Matcher throwing IllegalStateException after matchesMatcher 在比赛后抛出 IllegalStateException
【发布时间】:2011-07-09 03:53:48
【问题描述】:

我在使用 Matches 时遇到了一些奇怪的问题,希望有人能解释一下。
根据 Java 文档:

public boolean matches() ... 如果 匹配成功然后更多信息 可以通过开始,结束, 和分组方法。

一些代码:

private static Hashtable<String,String> splitAddress(String address){
        Hashtable<String,String> result = new Hashtable<String,String>();

        Matcher m = addrLong.matcher(address);
        if (m.matches()) {
            result.put("number", m.group(1));

这是它抛出的地方:

java.lang.IllegalStateException: No match found
    java.util.regex.Matcher.group(Matcher.java:485)
    splitAddress(WebServiceHelper.java:699)

这对我来说很奇怪。如果有帮助,这里有更多信息:

    private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
    private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
    private static final String typeRegex = "STREET|ST|DRIVE|DR|AVENUE|AVE|AV|ROAD|RD|LOOP|LP|COURT|CT|CIRCLE|LANE|LN|BOULEVARD|BLVD|CRESCENT|CR";

addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?");

我一直在测试的输入字符串是“12 CLARE ST E”

谢谢!

编辑:糟糕,我粘贴了我的 addrShort 声明而不是我的 addrLong

Edit2:我知道命名约定被打破了。我发誓,那部分不是我写的。

更新:

这可以作为独立函数成功执行。

任何想法为什么它会在 tomcat 环境中中断?

我会看看我是否能找到任何可能会影响这一点的东西,但我的 addrLong 是我唯一的静态变量,不会在其他任何地方使用。

这快把我逼疯了。我什至尝试过:

    Pattern p = Pattern.compile("(" + numberRegex + ")\\s(.*)");
    Matcher m = p.matcher(address);

    if (m.matches()) {
        result.put("number", m.group(1));

在我的服务器环境中,它失败了。

更新 2

当它单独在一个 servlet 中时,它甚至运行良好。我难住了。非常感谢任何提示或想法。

更新 3

搞砸了,我只是将函数移到另一个类中。感谢您的帮助@mjg123,有一个当之无愧的复选标记。

这将永远困扰我......

【问题讨论】:

  • 我也一样。当我调试并逐步完成它时。当我运行它时,它没有。我发现通过将我的代码包装在 if(matcher.matches() && matcher.groupCount() > 0) 中可以使其工作

标签: java regex matcher


【解决方案1】:

我复制并粘贴了您的代码,它按预期编译和运行,没有抛出异常。您的代码是否有其他部分导致此问题?


我的完整代码是:

public class StackOverflow {

    private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
    private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
    private static final String typeRegex = "STREET|ST|DRIVE|DR|AVENUE|AVE|AV|ROAD|RD|LOOP|LP|COURT|CT|CIRCLE|LANE|LN|BOULEVARD|BLVD|CRESCENT|CR";
    private static final Pattern addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?");

    public static void main(final String[] args) {
        final String address = "12 CLARE ST E";
        final Hashtable<String, String> result = splitAddress(address);
        System.out.println(result.get("number"));
    }

    private static Hashtable<String, String> splitAddress(final String address) {
        final Hashtable<String, String> result = new Hashtable<String, String>();

        final Matcher m = addrLong.matcher(address);
        if (m.matches()) {
            result.put("number", m.group(1));
        }
        return result;
    }
}

运行良好并打印12 作为其输出。

【讨论】:

  • 有趣。感谢您的反馈。我已将 addrLong 声明为 static final,但我认为这不会影响它?
  • 所以,我尝试做同样的事情。并得到了相同的结果。 (单独运行时有效)我想我会在 tomcat 环境中找到问题所在。
猜你喜欢
  • 2012-10-06
  • 2019-06-10
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多