【问题标题】:Matching a capturing group or failng the match if missing in Javascript regex如果在 Javascript 正则表达式中缺失,则匹配捕获组或匹配失败
【发布时间】:2017-06-26 19:44:37
【问题描述】:

我正在尝试获取一个数字 (5),然后是可能的 -(空格),然后是 3 位数字序列,最后是一个数字。如果第一组根本不匹配,则只返回其他数字序列。

^(5\-? ?)?(\d{3})(\d)$

这在我看来是正确的,不会引发任何错误,但它会返回 5

"5489" -> ()("548")("9")

我实际上不希望此表达式返回此模式的匹配项。

所以快速搜索让我找到了所有格表达和很多关于你前任的文章。从我正在阅读的内容来看,这看起来应该可以工作:

^(5\-? ?)?+(\d{3})(\d)$

但 Javascript 确实 喜欢将其作为正则表达式。

有没有办法在Javascript中做一个贪婪的所有格捕获组,或者在这种情况下模拟它?

【问题讨论】:

  • 在 JS ?+ 中没有所有格 quant@
  • 如果您查看 ECMAScript 5 文档,您会发现不支持所有格量​​词。
  • 如果只是不是5那么这个^(5\-? ?)?((?!5)\d{3})(\d)$
  • 试试^(?!5\d{3}$)(5\-? ?)?(\d{3})(\d)$。如果字符串以5 开头,然后是 3 位数字,则会立即匹配失败。
  • @RandyHall - 没有理由强迫任何事情。最后你有一个 固定 位数要匹配,而且你正在使用锚点 ^$。结论是,如果您只有 4 位数字,它们将在最后匹配,因为它是正则表达式设计的一个宗旨。如果您不想匹配以5 开头的 4 位数字,那么这是一个额外的断言,但与强制捕获第一组无关。我只是将其作为评论声明,因为这是一个 X/Y 问题,我不喜欢无缘无故地发帖。

标签: javascript regex regex-greedy


【解决方案1】:

您可以利用环视特性来模拟所有格量词功能:

^(?=(...))\1

正则表达式:

^(?=((5\-? ?)?))\1(\d{3})(\d)$

Live demo

【讨论】:

  • +1 我认为这是更好的答案。一,它模拟所有格,二,它不会匹配5890,但会匹配55890
【解决方案2】:

如果您查看 ECMAScript 5 文档,您会发现不支持所有格量​​词。

你可以使用

^(?!5\d{3}$)(5-? ?)?(\d{3})(\d)$

请参阅regex demo。如果字符串以 5 开头,然后是 3 位数字,(?!5\d{3}$) 否定前瞻将立即失败。

详情

  • ^ - 字符串开头
  • (?!5\d{3}$) - 不能有 5 然后是 3 位数字,字符串的结尾紧靠当前位置的右侧
  • (5-? ?)? - 5 的可选序列,然后是可选的 -,然后是可选的空格
  • (\d{3}) - 3 位数
  • (\d) - 一位数
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多