代码之家  ›  专栏  ›  技术社区  ›  gavenkoa

Java正则表达式:匹配由空格分隔的表达式

  •  -1
  • gavenkoa  · 技术社区  · 9 年前

    电话号码如下:

    +38097-12-34-123
    +380971234-123
    380971234-123
    

    我应该匹配字符串中的电话号码,假设它们由空格分隔。因此,这是不匹配的字符串:

    45+38097-12-34-123
    +38097-12-34-123=TEST
    my number:38097-12-34-123
    

    没有空格分隔符要求的电话号码的工作正则表达式是:

    \\+?380\\d\\d(?:-?\\d){7}
    

    我尝试测试 \b / \B boundary matcher 但如果领导,他们就不起作用 + 使用了标志。

    更新 我修正了示例,因为我从记忆中键入了它,但忘了放 8 签名

    更新2 @华盛顿猜想 你的正则表达式(I strip \ 从…起 \- ):

    \b(\+?\d{4}(?:-\d{2}-|\d{2})\d{2}-\d{3})\b
    

    不起作用,因为当 + 在匹配字符串中:

    bash# groovysh 
    groovy:000> "45 +8097-12-34-123".matches(".*\\b(\\+?\\d{4}(?:-\\d{2}-|\\d{2})\\d{2}-\\d{3})\\b.*")
    ===> true
    groovy:000> "45+8097-12-34-123".matches(".*\\b(\\+?\\d{4}(?:-\\d{2}-|\\d{2})\\d{2}-\\d{3})\\b.*")
    ===> true
    

    我期待那次没有白纸的旅行 + 标志应该失败。

    @斯特里比日夫 与您的建议相同:

    groovy:000> "45+38097-12-34-123".matches(".*(?<!\\w)\\+?380\\d\\d(?:-?\\d){7}(?!\\w).*")
    ===> true
    groovy:000> "45 +38097-12-34-123".matches(".*(?<!\\w)\\+?380\\d\\d(?:-?\\d){7}(?!\\w).*")
    ===> true
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   Wiktor Stribiżew    9 年前

    你面临的主要困难是让单词边界起作用 之前 可选的子模式 \+? 。对于后面的单词边界,您可以使用 \b (?!\w) (只有当上下文未知时才更可取,但在这里,您总是有一个必填数字,因此, \(b) 足够了)。

    由于回溯, \+? 被“狼吞虎咽” (?<!\w) 仅检查第一个数字前面是否没有非单词字符。自年以来 45+38097-12-34-123 , 3 前面是一个非单词 + ,它匹配。

    一种解决方案可以是在前瞻中使用替代方案:

    String re = ".*\\+?(?<!\\w|\\w\\+)380\\d\\d(?:-?\\d){7}\\b.*"; 
    String s = "45+38097-12-34-123"; 
    System.out.println(s.matches(re));
    

    看见 IDEONE demo

    请参见 regex demo with your input examples .

        2
  •  1
  •   gavenkoa    9 年前

    最后,我设法通过检查字符串的开头或空格的出现来编写哑解决方案:

    groovy:000> "+38097-12-34-123".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
    ===> true
    groovy:000> "45+38097-12-34-123".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
    ===> false
    groovy:000> "45 +38097-12-34-123".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
    ===> true
    groovy:000> "45 +38097-12-34-123xxx".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
    ===> false
    groovy:000> "45 +38097-12-34-123 xxx".matches("(?:^|.*\\s)(\\+?380\\d\\d(?:-?\\d+){7})\\b.*")
    ===> true
    

    最终的 \b 可以替换为 (?:\s.*|$) 但是groovy shell解析器很疯狂 $ 没有时间深入研究新问题。