Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
I';我试图使用java正则表达式来查找第一个出现的两位数_Java_Regex - Fatal编程技术网

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这就是梦想:)