我的用例是我有一个字符串应该保存一个地址。不幸的是,某些实例在字符串的开头有垃圾。我想取地址字符串的子字符串,我连续两个数字。
例如,
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
这让我相信最终的邮政编码正在抛弃它。有什么建议吗?
答案 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