【问题标题】:Why quantifier doesn't work [duplicate]为什么量词不起作用[重复]
【发布时间】:2016-06-16 16:24:03
【问题描述】:

我有以下正则表达式:

^(?:[\w]+?\/)?[\w]+?@[\w]+?\.[\w]+?$

现在我需要将整个字符串长度限制为 25 个字符: 我尝试了以下方法:

^((?:[\w]+?\/)?[\w]+?@[\w]+?\.[\w]+?){0,25}$

但它仍然匹配超过 25 个字符的正则表达式,为什么?

【问题讨论】:

  • 你能发布一些匹配或不匹配的例子吗?
  • 匹配外部 () 中出现 0 到 25 次的内容
  • 为什么不能简单检查字符串的长度是否小于等于25?
  • 每天都会有人问这类问题。见my recent answer。我标记为骗子,因为我相信我在原始问题中的回答包含解释如何在正则表达式中使用前瞻进行限制。
  • @WiktorStribiżew,是的,好的,但我误解的一点是令牌意味着 正则表达式中的字符串可以重复 n 次,而不是积极的前瞻工作方式。如果缺少此位,请将此添加到您的答案中,因为它很重要。谢谢!

标签: javascript regex


【解决方案1】:

为什么不简单

if ( inputStr.length <= 25 && /^(?:[\w]+?\/)?[\w]+?@[\w]+?\.[\w]+?$/.test( inputStr ) )
{
  //your logic
}

【讨论】:

  • 性能方面,length 检查应该放在第一位。
  • @JamesDonnelly 同意,做出改变
【解决方案2】:

量词应用于它前面的标记。在您的情况下,这是一个完整的组,并且该组可以匹配的不仅仅是一个字符。

单独检查长度,使用positive lookahead assertion:

^(?=.{0,25}$)(?:\w+\/)?\w+@\w+\.\w+$

如您所见,您的正则表达式也可以简化很多(不需要惰性量词和字符类)。

【讨论】:

  • 谢谢,我现在明白这个问题了。我制作了量词{2} 并复制了字符串,所以它匹配了,我明白你的意思了。一个问题,你为什么放弃惰性量词?
  • 当你真正需要贪婪的量词时,你不需要惰性量词。
  • @WiktorStribiżew,谢谢,但我不明白为什么我需要贪婪的人。你能详细说明一下吗?
  • 当您知道您需要匹配所有字母数字符号,然后是.,则无需使用\w+?\.,因为\w+\. 的工作方式相同。当某些模式可能与后续模式匹配相同类型的字符时,我们需要惰性量词,但我们希望在该字符第一次出现时停止。当您的模式已知时(如您的情况),避免延迟匹配是个好主意。
  • @WiktorStribiżew,知道了,非常感谢您提供非常有用的反馈 :)
【解决方案3】:

如果我们将您的原始正则表达式称为 A

^(?:[\w]+?\/)?[\w]+?@[\w]+?\.[\w]+?$

那么你的下一个正则表达式可以更简单地表示为

^(A){0,25}$

所以你不只匹配 25 个字符,你匹配 A 0 到 25 次

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多