【问题标题】:Why is bracket mandatory here?为什么这里必须使用括号?
【发布时间】:2015-02-26 19:56:58
【问题描述】:

1 . ^([0-9A-Za-z]{5})+$

2 。 ^[a-zA-Z0-9]{5}+$

我的意图是匹配任何长度为n 的字符串,使得n5 的倍数。 在这里查看:https://regex101.com/r/sS6rW8/1

请详细说明为什么 case 1 匹配字符串而 case 2 不匹配。

【问题讨论】:

  • 对不起,那是我。箭头错误。
  • 请标记您的正则表达式风格。
  • @MAKZ:您的第一个正则表达式中的A-z 范围是不是拼写错误?因为[A-z][A-Za-z] 相同。你可以找到完整的解释here
  • @AlanMoore 谢谢。固定

标签: regex pcre


【解决方案1】:

因为{n}+ 并不代表你认为的那样。在 PCRE 语法中,这会将 {n} 转换为 possessive quantifier。换句话说,a{5}+(?>a{5}) 相同。这就像表达式a++ 中的第二个+,与使用atomic group (?>a+) 相同。

这对固定长度的{n} 没有用,但与{min,max} 一起使用时更有意义。所以,a{2,5}+ 等价于(?>a{2,5})

举个简单的例子,考虑以下模式:

^(a{1,2})(ab)    will match  aab -> $1 is "a", $2 is "ab"
^(a{1,2}+)(ab)   won't match aab -> $1 consumes "aa" possessively and $2 can't match

【讨论】:

    【解决方案2】:

    ^([0-9A-Za-z]{5})+$ 中,您说的任何数字或字母长度为 5 个字符 1 次或多次。 + 在整个组上(括号内的内容),{5}[0-9A-Za-z]

    您的第二个示例有一个无回溯子句{5}+,它与(stuff{5})+ 不同

    【讨论】:

    • 你的意思是一次或多次?
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2012-05-12
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多