【问题标题】:JavaScript regular expression with word boundary requirement具有单词边界要求的 JavaScript 正则表达式
【发布时间】:2015-09-15 06:34:05
【问题描述】:

我正在为一个较大字符串中的电话号码编写一个正则表达式,但我在满足一个特定要求时遇到了一些麻烦。

基本要求是匹配以下电话号码样式 - 带有区号或国际前缀的标准澳大利亚电话号码以及空格和连字符的一点余地:

0395551234
03 9555 1234
03-9555-1234
+61395551234

但是,我只想匹配一个数字,如果它在第一个字符之前和最后一个字符之后有一个单词边界,所以下面的样式不应该匹配:

0395551234word
03 9555 1234word
03-9555-1234word
+61395551234word
word0395551234
word03 9555 1234
word03-9555-1234
word+61395551234

这是我的正则表达式字符串:

((\+61[ \-]?[2378]|\b0[2378]|\(0[2378]\))[ \-]?[0-9]{4}[ \-]?[0-9]{4}\b)

但这不正确,因为它仍然会匹配:

word+61395551234

我不能在+ 字符之前使用单词边界\b,因为+ 字符不是单词字符。我还要注意,我使用的是 JavaScript,所以如果 + 字符位于行首或前面有空格字符,我不能使用正面构造来匹配 + 字符。如果我可以使用它,这是一个可以满足我要求的 Perl 正则表达式:

(((?<=^|\s)\+61[ \-]?[2378]|\b0[2378]|\(0[2378]\))[ \-]?[0-9]{4}[ \-]?[0-9]{4}\b)

我也不能对我正在使用的大字符串进行任何额外的处理,因为我需要完全保留它的结构,所以在尝试匹配之前没有replace() 操作。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您不能在+ 字符之前使用\b,因为它不被视为单词字符。而是在 + 之前使用:(?:^|\s) 以确保 + 出现在行首或空格之后。

    使用这个正则表达式:

    (((?:^|\s)\+61[ -]?[2378]|\b0[2378]|\(0[2378]\))[ -]?[0-9]{4}[ -]?[0-9]{4}\b)
    

    RegEx Demo

    【讨论】:

    • 一个非捕获组,我明白了。这几乎是完美的,但是我注意到如果字符串是“word +61395551234”,那么我会捕获“+61395551234” - 注意开头的额外空格?但我无法解释为什么会被捕获。
    • Do you want this 请记住,前面仍然会匹配(未捕获),因为 JS 中没有后视。
    • 这样稍微好点。感谢您在这里的帮助,这对我来说可能已经足够接近了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2011-04-14
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多