我使用以下正则表达式来匹配城市:
[a-zA-Z]+(?:[ '-][a-zA-Z]+)*问题是它不仅与城市相匹配,而且也是街道名称的一部分。
我怎样才能使它只与城市(如布鲁克林和哥伦比亚城)相匹配?
更新:
数据用一行文本表示(每个地址将分别输入regex引擎):
2778 Ray Ridge Pkwy,
Brooklyn NY 1194-5954
1776 99th St,
Brooklyn NY 11994-1264
1776 99th St,
Columbia City OR 11994-1264发布于 2015-08-07 06:14:06
我建议以下方法:从字符串的开头到两个大写字母与ZIP后面的第一次出现为止,匹配单词(请参见下面的(?=\s+[A-Z]{2}\s+\d{5}-\d{4}) ):
^[A-Za-z]+(?:[\s'-]+[A-Za-z]+)*(?=\s+[A-Z]{2}\s+\d+-\d+)请参阅演示
裁判官:
^ -然后从一开始就开始看[A-Za-z]+ -匹配一个单词(?:[\s'-]+[A-Za-z]+)* -匹配0或多个单词.(?=\s+[A-Z]{2}\s+\d+-\d+) -就在空格+2个大写字母、空格、1个或更多数字、连字符和1个或更多数字之前。如果ZIP (或任何数字所代表的数字)是可选的,则只需使用2个大写字母:
^[A-Za-z]+(?:[\s'-]+[A-Za-z]+)*(?=\s+[A-Z]{2}\b)请注意,\b in \s+[A-Z]{2}\b是一个单词边界,它将强制一个非单词(空格或标点符号,甚至字符串的末尾)出现在两个大写字母之后。
只是不要忘记在Java中使用双反斜杠来转义regex特殊的元字符。
这是一个Java代码演示
String s = "Brooklyn NY 1194-5954";
Pattern pattern = Pattern.compile("^[A-Za-z]+(?:[\\s'-]+[A-Za-z]+)*(?=\\s+[A-Z]{2}\\b)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(0));
} 发布于 2015-08-07 06:09:44
好的..。我想经过几个小时的调整和测试,我终于找到了。可能对其他人有帮助。这就是诀窍:
(?<=\n)[a-zA-Z]+(?:[ '-][a-z]+)* ?[A-Z]?[a-z]+发布于 2015-08-07 06:13:24
如果您的所有数据都类似于问题中的示例,数据中的模式是从街道后面的逗号到至少两个大写字母(表示状态)的所有内容。
此模式与所描述的模式匹配,并选择一个应代表城市的组:
,\s+([a-zA-Z\s]*)[A-Z]{2,}?\s+https://stackoverflow.com/questions/31870493
复制相似问题