LookaHead RegEx和其他一个区别?

时间:2014-06-05 23:20:13

标签: .net regex regex-lookarounds

任何人都可以告诉我哪个是最佳解决方案?

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

,第二个检查最小长度为5但未验证最大长度。为什么呢?

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

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

谢谢, VIJI

2 个答案:

答案 0 :(得分:2)

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

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

您可能想要使用的是

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

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

答案 1 :(得分:2)

在对Bergi(正确)答案的评论中,您要求一种方法来匹配您的字符串而不需要前瞻。

这是一个。这是一个简洁的正则表达式技巧,但它不会使正则表达式比使用前瞻时更简单。

^(?:([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(|的右侧),则表示我们没有匹配单个字母,并且字符串断言的^开头强制正则表达式失败。