【问题标题】:Regex giving extra output in java正则表达式在java中提供额外的输出
【发布时间】:2014-02-21 09:22:13
【问题描述】:

我的代码是这样的:

String try1 = " how abcd is a lake 3909 Witmer Road Niagara Falls NY 14305 and our adress is 120, 5th cross, 1st main, domlur, Bangalore 50071 nad 420, Fanboy Lane, NewYark, AS 12345";
String add1="( \\b+[0-9]{3,5}[, ]* (.*)[, ]* (.*)[, ]* [a-zA-Z]{2} [0-9]{5})";
Pattern p = Pattern.compile(add1);
Matcher m = p.matcher(try1);
if(m.find())
{ 
    System.out.println("Address ======> " + m.group());
}
else System.out.println("Address ======>Not found ");

我只想输出美国地址:

[(3909 Witmer Road Niagara Falls NY 14305) and (420, Fanboy Lane, NewYark, AS 12345)]

但它的输出是这样的:

(3909 Witmer Road Niagara Falls NY 14305 and our adress is 120, 5th cross, 1st main, domlur, Bangalore 50071 nad 420, Fanboy Lane, NewYark, AS 12345)

【问题讨论】:

    标签: java regex regex-lookarounds


    【解决方案1】:

    您可以尝试更多类似这样的正则表达式:

    "(\\b[0-9]{3,5},? [A-Za-z]+(?: [A-Za-z]+,?)* [a-zA-Z]{2} [0-9]{5})"
    

    [A-Za-z]+,? 部分只允许字母(而不是数字)。

    regex101 demo.

    【讨论】:

    • 这只会给出美国的一个地址。但是 sting 包含 2 个地址...我想要两个都在输出中...并且地址的数量可能会随着字符串的变化而增加。
    • @AnkitKumar 你必须使用while 循环。 See working demo.
    • 谢谢杰瑞.. 我明白了。 :)
    • @AnkitKumar 不客气 :) 如果有帮助,您可以将我的答案标记为已接受(这也会将您的问题标记为已解决)。
    【解决方案2】:

    * 操作符是贪心的,所以它匹配尽可能多的字符。在您的表达式中,与邮政编码和状态匹配的 [a-zA-Z]{2} [0-9]{5} 部分与输入中的最后一个 ZIP 和状态匹配,因为 .* 您之前拥有的模式在表达式中,尽可能多地展开字符。

    尝试将.s 更改为[^0-9],使其匹配除数字以外的任何内容。

    【讨论】:

    • ([^0-9][, ]* (.*)[, ]* (.*)[, ]* [a-zA-Z]{2} [0-9] {5})
    • 您没有按照我的要求更改点。将所有 (.)* 更改为 [^0-9]*
    • 另外,不要更改开头,将其保留为 \\b+[0-9]{3,5}[, ]*
    • 好吧...我试过这样 ([0-9]{3,5}[, ]* ([^0-9]*)[, ]* ([^0-9 ]*)[, ]* [a-zA-Z]{2} [0-9]{5}) .... 但它只给出一个地址...但输入字符串包含 2 个美国地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多