I';我试图使用java正则表达式来查找第一个出现的两位数
我的用例是,我有一个字符串,应该保存一个地址。不幸的是,有些实例在字符串的开头有垃圾。我想取地址字符串的子字符串,其中一行有两个数字 比如说,I';我试图使用java正则表达式来查找第一个出现的两位数,java,regex,Java,Regex,我的用例是,我有一个字符串,应该保存一个地址。不幸的是,有些实例在字符串的开头有垃圾。我想取地址字符串的子字符串,其中一行有两个数字 比如说, 1ST MTG-HAZ @230 MAPLE WAY STREET FLOWERS, WY 23042 应成为: 230 MAPLE WAY STREET FLOWERS, WY 23042 Pr>在字符串或中间的乞讨时,ReXX应该能够检查两个数字。 到目前为止,我所尝试的: if(addrStr.matches("(?s).*[0-9][0-
1ST MTG-HAZ @230 MAPLE WAY STREET FLOWERS, WY 23042
应成为:
230 MAPLE WAY STREET FLOWERS, WY 23042
<> Pr>在字符串或中间的乞讨时,ReXX应该能够检查两个数字。
到目前为止,我所尝试的:
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";
}
此代码似乎适用于某些地址,但不适用于其他地址。当我使用regex测试仪时,它适用于:
2ND MTG-SFH PRIM RES@1234 OPEN DOOR DR, HOLLYWOOD FL
但不是为了
1ST MTG-HAZ @230 MAPLE WAY STREET FLOWERS, WY 23042
这让我相信zipcode最终会把它扔掉。有什么建议吗?您可以用这种方式替换输入的任何开头,后面跟两个直数字:
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
注意
这不如实际寻找分隔符那么优雅
您的“坏”地址似乎都有一个@
分隔“正确”地址的开头
我可能会研究如何将其转化为您的优势。您可以用以下方式替换输入的任何开头,即后跟两个直数字:
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
注意
这不如实际寻找分隔符那么优雅
您的“坏”地址似乎都有一个@
分隔“正确”地址的开头
我可能会研究如何将其转化为您的优势。您可以颠倒regex的顺序,以匹配前2个digt中的地址
[0-9][0-9].*$
例如见
这会匹配的
230 MAPLE WAY STREET FLOWERS, WY 23042
2ND MTG-SFH PRIM RES
230 MAPLE WAY STREET FLOWERS, WY 23042
您可以颠倒regex的顺序,以匹配前2个digts中的地址,如下所示
[0-9][0-9].*$
例如见
这会匹配的
230 MAPLE WAY STREET FLOWERS, WY 23042
2ND MTG-SFH PRIM RES
230 MAPLE WAY STREET FLOWERS, WY 23042
您的“正确”地址是否有可能从输入的开头开始,或者在出现
@
之后开始?请尝试简单的查找(?s)(\d{2}.*)$
替换$1
基本问题是正则表达式的这一部分*
从字符串末尾开始向后搜索,直到找到\d\d
。通过使其成为非贪婪的*?
来修复此问题。即使它起作用,*?
也不应该是匹配的仲裁人。您的“正确”地址是否有可能从输入的开头开始,或者在出现@
之后开始?请尝试一个简单的查找(?s)(\d{2}.*)$
替换$1
基本问题是正则表达式的这一部分*
从字符串末尾开始向后搜索,直到找到\d\d
。通过使其成为非贪婪的*?
来修复此问题。即使它有效,*?
也不应该成为匹配的仲裁人。这正是我想要的,而且要简单得多。谢谢你的解决方案!我认为这些糟糕的地址也都有@字符,但在进一步调查后,我发现了它们没有的实例。我只是用前几个例子来简化。您的解决方案似乎是最简单的解决方案。这正是我想要的,而且要简单得多。谢谢你的解决方案!我认为这些糟糕的地址也都有@字符,但在进一步调查后,我发现了它们没有的实例。我只是用前几个例子来简化。您的解决方案似乎是最简单的解决方案。@sln我只是想删除答案,认为它是错误的,而不是OP正在寻找的for@sln这就是我的梦想:)@sln我只是想删除答案,认为它是错误的,而不是OP在寻找的for@sln这就是梦想:)