正则表达式将整个字符串放在第1组中

时间:2016-02-11 15:15:54

标签: java regex

尝试在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

1 个答案:

答案 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