【问题标题】:Can't figure out what's going on with RegExp question mark无法弄清楚 RegExp 问号是怎么回事
【发布时间】:2017-12-08 10:49:54
【问题描述】:

我想匹配以点开头的数字集,或者什么都不匹配。我想出了正则表达式(?:\.\d+)?。但是,它会匹配字符串.,即使\d 上的量词是一个加号。如果我去掉最后一个问号,我相信这会使该组成为可选的,因为没有前面的量词,那么它就可以正常工作。我在 JavaScript 中使用 RegExp 引擎,在这种情况下特别是 node.js

这是我从测试中得到的:

  • .123,无可选:true
  • .,无可选:false
  • 空,无可选:false

  • .123,可选:true

  • .,可选:true
  • 空,可选:true

  • .123,预期:真

  • .,预期:错误
  • 空,预期:真

谢谢。

【问题讨论】:

  • 您能否添加这些测试用例是否应该匹配(预期输出)。类似:.123,没有可选:true,应该匹配...
  • 您将整个捕获组设为可选,这基本上就是您的表达方式。字符串上不需要出现任何内容(一切都是可选的),所以任何字符串都会出现。
  • /(\.\d+)/ 不够吗? (或者/\.(\d+)/,如果你不想捕获这个点?)
  • @DanielBeck Ha 我刚刚在我的回答中添加了这一点,OP 肯定使事情过于复杂:P

标签: javascript regex


【解决方案1】:

使用

/^<your regex>$/

作为一般规则,以确保您的整个字符串匹配。现在您的正则表达式允许可以在任何时候匹配的空字符串。

注意

/(?:\.\d+)?/.test('a') === true

并且正则表达式将匹配任何非空字符串。

【讨论】:

  • /^(?:\.\d+)?$/.test('') 也将是真的
【解决方案2】:

您需要像这样在正则表达式中添加 ^ 和 $ 标记

^(?:\.\d+)?$

否则它将在字符串中的任何位置匹配一个空字符串。

【讨论】:

  • 哇,这怎么可能是答案?
  • @BoxTechy 这如何回答您的问题?这仍将匹配 .
  • @Clonkex OP想要匹配一个空字符串或一个点后跟一个或多个数字,这个答案可以实现。
  • @JordanGray 哦,对。我完全误解了这个问题。这个答案确实是正确的(实际上意味着我的答案不正确)。
  • @Clonkex 没关系——正则表达式几乎和它们写起来一样难描述! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2015-04-06
  • 2018-05-16
  • 2013-05-19
相关资源
最近更新 更多