如果Javascript正则表达式中缺少匹配捕获组或失败匹配

时间:2017-06-26 19:44:37

标签: javascript regex regex-greedy

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

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

这看起来对我来说并不会引发任何错误,但它会给5回复:

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

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

所以快速搜索带给我占有欲的表达方式和很多关于你的前任的文章。从我正在阅读的内容来看,它看起来应该有效:

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

但Javascript像正则表达式一样

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

2 个答案:

答案 0 :(得分:3)

您可以通过利用外观质量来模拟占有量词功能:

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

正则表达式:

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

Live demo

答案 1 :(得分:1)

如果你看一下ECMAScript 5文档,你会发现没有对占有量词的支持。

您可以使用

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

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

<强>详情:

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