【问题标题】:Difference between LookaHead RegEx and other one?LookaHead RegEx 和其他的区别?
【发布时间】:2014-06-05 23:20:13
【问题描述】:

谁能告诉我哪个是最好的解决方案?

我正在尝试获取 5 到 10 个字符,至少一个字母,没有特殊字符,\w 中的字符是可以接受的。

第二个是检查最小长度 5 但不验证最大长度。为什么?

    ^(?=.{5,10}$)(\w*[a-z]\w*)$

    ^(\w*[a-z]\w*){5,10}$

谢谢, 维吉

【问题讨论】:

  • 我不确定您的问题是什么。如果您没有得到答案,请提供更多详细信息。
  • 嘿 Viji 我同意 Bergi 的观点,即这么小的正则表达式任务的性能可能无关紧要,但是如果你对解决方案进行基准测试,我很想知道结果,你能分享一下吗?跨度>
  • @zx81 :Bergi 和你们都回答了我的问题。我非常感谢您花时间提出新的正则表达式和解释。
  • @Viji 如果您同样喜欢这两个答案,请随意掷硬币选择接受的答案,我不会介意,我相信 Bergi 也不会介意。 :)

标签: .net regex regex-lookarounds


【解决方案1】:

因为在第二个中,整个组(\w*[a-z]\w*)被允许重复5到10次。

在该组中,您可以使用任意数量的 \w 字符。

您可能想要使用的是

^(?=.*?[a-z])\w{5,10}$

但你的第一个表达也很好。我不认为没有前瞻的简单解决方案。

【讨论】:

  • 谢谢。那么如何在第二个表达式中设置最大限制?这个表达式叫贪心表达式吗?
  • 整个表达式通常不称为“贪婪”。 * repetition 是贪婪的,是的。
  • 好的。有没有办法在不使用前瞻的情况下设置最大限制?
  • .Net 没有前瞻功能吗? Here's a question 做类似的事情,并且有一个可以接受的答案和前瞻......
【解决方案2】:

在对 Bergi 的(正确)答案的 cmets 中,您要求一种无需前瞻即可匹配字符串的方法。

这是一个。这是一个巧妙的正则表达式技巧,但它并没有使正则表达式比使用前瞻时更简单。

^(?:([a-z])|[_0-9]){5,10}(?(1)|^)$

这适用于支持条件的正则表达式风格,例如 .NET、PCRE、Python 和 Ruby。

它是如何工作的?

  1. (?:([a-z])|[_0-9]) 只匹配一个字符。要指定字符,我们使用替代|。如果字符是字母,([a-z]) 中的括号会将其捕获到第 1 组。
  2. {5,10} 量词确保我们匹配正确数量的字符
  3. (?(1)|^) 是检查是否已设置捕获 Group1 的条件。如果已设置(| 的左侧),则不执行任何操作。如果未设置组 1(| 的右侧),则意味着我们没有匹配单个字母,并且字符串断言的 ^ 开头会强制正则表达式失败。

【讨论】:

  • (?!) 不也是前瞻吗?
  • @Bergi 是的,你是对的。请看修订版,甚至更整洁。 :)
  • 多么可恶! +1 聪明。希望这不会在任何地方使用:-)
  • Hope this doesn't get used anywhere 我也没有。:) 但是您可能知道,在使用平衡组时,这种结构是常见的做法(也是必要的)。
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多