【问题标题】:"IllegalStateException: No match found" when getting match group [duplicate]获取匹配组时出现“IllegalStateException:未找到匹配项”[重复]
【发布时间】:2015-07-17 08:29:15
【问题描述】:

我正在使用以下代码从 txt 中提取街道地址、州、城市和 zip。

public boolean parseGoogleAddress(Iterator<WebElement> iter)
{
    //String streetAddressRegex = "(?<=at\\s)\\d{3,5}\\s\\S*\\s\\w*.*?(?=,)";
    String stateRegex = "(?<=\\s)[A-Z]{2}(?=\\s)";
    String cityRegex = "\"(?<=,)\\s.{2,25}(?=,)\"";
    String zipRegex = "\"(?<=\\s)\\d\\d\\d\\d\\d\\]]\\]\"";

    String streetAddress;
    String state;
    String city;
    String zip;

    Pattern streetAddressPattern = Pattern.compile("(?<=at\\s)\\d{3,5}\\s\\S*\\s\\w*.*?(?=,)");
    Pattern statePattern = Pattern.compile(stateRegex);
    Pattern cityPattern = Pattern.compile(cityRegex);
    Pattern zipPattern = Pattern.compile(zipRegex);



    while(iter.hasNext()) {
        WebElement webelementAddressList = iter.next();

        String singleAddress = webelementAddressList.getText();

        System.out.println("Value of singleAddress: " + singleAddress);

        Matcher streetAddressMatch = streetAddressPattern.matcher(singleAddress);
        Matcher stateMatch = statePattern.matcher(singleAddress);
        Matcher cityMatch = cityPattern.matcher(singleAddress);
        Matcher zipMatch = zipPattern.matcher(singleAddress);

        streetAddress = streetAddressMatch.group();
        System.out.println(streetAddress);


        System.out.println("streetAddressMatch: " + streetAddressMatch.group(0) + " stateMatch: " + stateMatch.group() + "cityMatch: " + cityMatch.group() + "zipMatch: " + zipMatch.group());
        break;
        }

    return true;

}

"itr" 只包含一个类似于下面提到的地址列表。

我尝试将变量更改为 streetAddressRegex 的普通正则表达式(正如您在代码中看到的那样),但我仍然没有得到结果。

每次我运行它都会得到这样的结果:

Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Unknown Source)
at java.util.regex.Matcher.group(Unknown Source)
at ParseAddress.parseGoogleAddress(ParseAddress.java:45)
at ScrapeAddress.GoogleScrapeAddress(ScrapeAddress.java:73)
at Main.main(Main.java:46)

正则表达式模式已经过测试,可以自行正常工作。

传递文本/地址以查找正则表达式模式的示例如下:

    Find Salvation Army Thrift Store at 269 Washington St, West Warwick, RI 02893-5910. Call them at (401) 828-6301

我把 .group(0) 改成了 .group() 但还是不行。

我是否错误地编译了模式?请指教。

谢谢

【问题讨论】:

  • ? 这样的量词必须被转义。 "(?&lt;=\\s)[A-Z]{2}(?=\\s)"问号肯定会给你带来问题,无论是第一组还是第二组
  • 我不认为问号是问题所在。如果我尝试逃避它,Eclipse 开始抱怨
  • 正则表达式的转义字符是用双斜杠完成的 - \\ 而不是一个单斜杠(比如当你转义引号时 - \"
  • 我明白了.. 但显然这不是问题,因为添加 find() 方法按照另一个人的建议工作.. 但我仍然不明白它背后的逻辑
  • 当你去餐厅打电话给服务员时,你不能指望他知道你点了什么,对吧?这里也一样——当你创建一个Matcher 时,你不能指望它知道你是想让它立即匹配行,还是先做另一个操作。这就是为什么您调用 find()match() 方法来执行此操作的原因...

标签: java regex


【解决方案1】:

问题是这一行:

streetAddress = streetAddressMatch.group();

您在调用group() 之前没有调用streetAddress.find()streetAddress.matches()

【讨论】:

  • Doesn't 'Matcher streetAddressMatch = streetAddressPattern.matcher(singleAddress);'照顾这个?也许我错过了一些东西..我需要同时打电话吗?
  • Matcher streetAddressMatch = streetAddressPattern.matcher(singleAddress); 只是声明了一个Matcher。但是您需要在此方法上调用 find()matches() 才能填充所有组。
  • 但是matches() 返回一个布尔值。我不明白为什么需要它?无论如何,我只是尝试过它并且它有效!但我不明白为什么需要这一步..我会接受你的回答..如果你能解释每一步会更好..
  • 它没有,它只是告诉你是否有匹配...
  • 正如我之前所说,只有find / matches 调用在给定输入的情况下再次执行正则表达式。 Matcher 对象保持未填充,否则 IllegalStateException
猜你喜欢
  • 2021-06-21
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
相关资源
最近更新 更多