尝试在Java中使用regex将地址拆分为数据库表中的两列。我要匹配的字符串是:
102 Main St. BLDG 105
第1组应持有102 Main St。
第2组应该持有BLDG 105
第3组实际上并不需要确定如何做到这一点。
使用以下所有内容放在第1组
中(.+)(\s(APT|LOT|BLDG|UNIT|TRLR|SUITE|STE)*)
我使用java中的组来设置属性。
===== EDIT ==
感谢@WiktorStribiżew的所有帮助,它让我非常接近我想要做的事情。
我现在使用的正则表达式是:
(.+)\s((?:APT|LOT|BLDG|UNIT|TRLR|SUITE|STE).*)
组1不是懒惰我需要它来消耗奇数实例,其中标记在字符串中出现两次。
我也不确定边界这个词在做什么,并在我最近的代码中将其删除。
以下是我的测试用例
123作为St STE 5
120 LOT St LOT A100< - 为什么第1组不懒惰。
120 N. LOT St< - 此案例失败 < - 第1组:120 N.组:2 LOT St
100 LOT St LOT#as8080
123 LOT St< - 这是可以的,我在代码中有条件,但其他方面会分裂。
125 MERLOT博士很多A800
答案 0 :(得分:1)
您可以将以下正则表达式与String#matches
:
String p = "(.+?)\\s*(\\b(?:APT|LOT|BLDG|UNIT|TRLR|SUITE|STE)\\s+\\d+).*";
请参阅regex demo
(?:...)
是非捕获组,因此没有特殊组。
惰性匹配(.+?)
将匹配并捕获到第1组中的所有文本,直到第一个空格,然后是您的备选方案。然后,第2组将保留其中一个替代+空格+数字。
以下是满足要求的正则表达式的版本:1)组1不是懒惰的(这意味着,matcher.group(1)
结果应该从空白中修剪),2)单词边界确保我们之前不匹配在“LOTTERY”:
^(.+)\s*(\b(?:APT|LOT|BLDG|UNIT|TRLR|SUITE|STE)\b.*)$
请参阅another demo