我正在尝试使用java正则表达式来查找第一次出现的双位数字

时间:2014-11-10 17:00:19

标签: java regex

我的用例是我有一个字符串应该保存一个地址。不幸的是,某些实例在字符串的开头有垃圾。我想取地址字符串的子字符串,我连续两个数字。

例如,

1ST MTG-HAZ @230 MAPLE WAY STREET FLOWERS, WY 23042

应该成为:

230 MAPLE WAY STREET FLOWERS, WY 23042

正则表达式应该能够在字符串的乞讨处或中间检查双数字。


到目前为止我尝试过:

if(addrStr.matches("(?s).*[0-9][0-9]")) {
   Pattern pattern = Pattern.compile("[0-9][0-9]");
   Matcher matcher = pattern.matcher(addrStr);
   if(addrStr.matcher(".*[0-9][0-9]").find(){
   if(matcher.find()){
      addrStr = addrStr.substring(matcher.start(),addrStr.length());
   }
} else {
   addrStr = "No match";
}

此代码似乎适用于某些地址,但不适用于其他地址。当我使用正则表达式测试器时,它适用于:

2ND MTG-SFH PRIM RES@1234 OPEN DOOR DR, HOLLYWOOD FL

但不适用于

1ST MTG-HAZ @230 MAPLE WAY STREET FLOWERS, WY 23042

这让我相信最终的邮政编码正在抛弃它。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您可以用以下方式替换输入的任何开头,后面跟着两个直的数字:

String[] input = {
  "1ST MTG-HAZ @230 MAPLE WAY STREET FLOWERS, WY 23042",
  "230 MAPLE WAY STREET FLOWERS, WY 23042"
};
for (String s: input) {
    //                               | start of input
    //                               || 0 or more characters, reluctantly quantified
    //                               ||   | followed by 2 digits (non-capturing)
    //                               ||   |            | replace with empty
    System.out.println(s.replaceAll("^.*?(?=\\d{2,})", ""));
}

<强>输出

230 MAPLE WAY STREET FLOWERS, WY 23042
230 MAPLE WAY STREET FLOWERS, WY 23042

注意

这不如实际寻找分隔符那么优雅。

似乎你的“坏”地址都有@分隔“正确”地址的开头。

我可能会研究如何将其转化为您的优势。

答案 1 :(得分:2)

您可以将正则表达式的顺序颠倒以匹配前2个挖掘中的地址

[0-9][0-9].*$

例如,请参阅http://regex101.com/r/dN7hO6/1

这将匹配

230 MAPLE WAY STREET FLOWERS, WY 23042
2ND MTG-SFH PRIM RES
230 MAPLE WAY STREET FLOWERS, WY 23042