【问题标题】:Match only if not preceded or followed by a digit仅当前面或后面没有数字时才匹配
【发布时间】:2016-03-07 23:30:29
【问题描述】:

我有这个正则表达式来查找代码库中的电话号码:

\\d{3}[\.\s-]?\d{3}[\.\s-]?\d{4}\g

我如何修改它以使其不会匹配数字前面或后面跟着数字的实例?

18005555555 (should not match)
80055555551 (should not match)
"8005555555" (should match)
s800-555-5555 (should match)
8005555555 (should match)
800.555.5555 (should match)

编辑: 我并不是要“匹配整个单词”,因为匹配前后有一个空格是不够的。请参阅上面的第三个示例,该示例也应返回匹配项。

我只想匹配匹配前后没有数字的实例。

换句话说:

[NOT DIGIT][PHONE NUMBER][NOT DIGIT]

【问题讨论】:

  • ^$ 括起来? /^\d{3}[.\s-]?\d{3}[.\s-]?\d{4}$/
  • 如果包含在文本中,则使用 word-boundries \b
  • @WiktorStribiżew 该解决方案与“s8005555555”不匹配。
  • @SebastianProske,我还想匹配字母或其他字符可能出现在数字之前或之后的情况。
  • @Himmel - 所以使用前瞻和后瞻应该可以工作,试试(?<!\d)\d{3}[.\s-]?\d{3}[.\s-]?\d{4}(?!\d)

标签: regex


【解决方案1】:

Lookahead 和 Lookbehind 将帮助您解决这些限制 - 如果它们受支持,例如

/(?<!\d)\d{3}[.\s-]?\d{3}[.\s-]?\d{4}(?!\d)/g

如果不支持,您可以将后向 (?&lt;!\d) 替换为 (?:^|\D)。如果不支持,您可以将前瞻 (?!\d) 替换为 (?:\D|$)

您可以在这里找到演示:https://regex101.com/r/aS8jQ8/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多