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