【问题标题】:Groups and quantifiers {m,n}组和量词 {m,n}
【发布时间】:2013-05-23 14:07:12
【问题描述】:

是否可以在组中使用量词?

例如。我想匹配类似的东西:

  • 11%
  • 09%
  • aa%
  • zy%
  • g1%
  • 8b% ...

模式是:2个字母或数字(混合或不混合)和一个以%结尾的字符串...

<?php
echo preg_match('~^([a-z]+[0-9]+){2}%$~', 'a1%'); // 0, I expect 1.

我知道,这个例子没有太多意义。一个简单的 [list]{m,n} 可以解决这个问题。尽可能简单地得到答案。

【问题讨论】:

  • 我认为正则表达式与您希望它匹配的内容不匹配。该正则表达式匹配一个或多个字母,后跟一个或多个数字,两次,然后是 % 和字符串的结尾。所以a1a1% 会匹配。我想你要写的是/^([a-z]|[0-9]){2}%$/。这将与您提供的字符串匹配,并作为您希望将量词与组一起使用的示例(这是完全合法的,根据 @jerry 的回复)。

标签: php regex preg-match regex-group quantifiers


【解决方案1】:

您当然可以将量词应用于组。例如,我有字符串:

HouseCatMouseDog

我有正则表达式:

(Mouse|Cat|Dog){n}

n 是任意数字。您可以尝试更改 n here 的值。

至于您的示例(是的,[list]{m,n} 会更简单),只有当有一个或更多字母,后跟一个数字或更多时,它才会起作用。因此,只有 g1 会匹配。

【讨论】:

    【解决方案2】:

    您不需要使用 2 个字符类,只有一个可以完成您的工作。

    echo preg_match('~^([a-z0-9]{2})%$~', 'a1%'); 
    

    正则表达式含义

    ^ => It will match at beggining of the string/line
    (
        [a-z0-9] => Will match every single character that match a-z(abcdefghijklmnopqrstuvwxyz) class and 0-9(0123456789) class.
        {2} => rule above must be true 2 times
    ) => Capture block
    % => that character must be matched after a-z and 0-9 classes
    $ => end of string/line
    

    【讨论】:

    • 在此示例之后,它必须以字母开头。谢谢。
    • @ThomThomThom 可以以数字开头。字符类不查看其中字符的顺序。在上面的正则表达式中,您可能会出现根本没有字母的情况,它仍然会匹配。
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2020-11-18
    • 2012-09-24
    • 1970-01-01
    • 2014-09-04
    • 2014-12-24
    相关资源
    最近更新 更多