Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 这部电影怎么样?在正则表达式中使量词变懒_Regex_Operators_Quantifiers - Fatal编程技术网

Regex 这部电影怎么样?在正则表达式中使量词变懒

Regex 这部电影怎么样?在正则表达式中使量词变懒,regex,operators,quantifiers,Regex,Operators,Quantifiers,我最近一直在研究正则表达式,发现?操作符使*、+或?变得懒惰。我的问题是它是如何做到这一点的?例如,*?是一个特殊运算符,还是?对*有影响?换句话说,正则表达式是将*?本身识别为一个运算符,还是将*?识别为两个单独的运算符*和??如果将*?识别为两个单独的运算符,则?如何影响*使其变懒。如果?意味着*是可选的,这难道不意味着*根本不存在吗。如果是这样,那么在语句*?中,正则表达式不是只匹配单独的字母和整个字符串而不是较短的字符串吗?请解释,我非常想理解。非常感谢。想象你有以下文字: BAAAAA

我最近一直在研究正则表达式,发现
操作符使
*
+
变得懒惰。我的问题是它是如何做到这一点的?例如,
*?
是一个特殊运算符,还是
*
有影响?换句话说,正则表达式是将
*?
本身识别为一个运算符,还是将
*?
识别为两个单独的运算符
*
?如果将
*?
识别为两个单独的运算符,则
如何影响
*
使其变懒。如果
意味着
*
是可选的,这难道不意味着
*
根本不存在吗。如果是这样,那么在语句
*?
中,正则表达式不是只匹配单独的字母和整个字符串而不是较短的字符串吗?请解释,我非常想理解。非常感谢。

想象你有以下文字:

BAAAAAAAAD
以下正则表达式将返回:

/B(A+)/ => 'BAAAAAAAA'
/B(A+?)/ => 'BA'
/B(A*)/ => 'BAAAAAAAA'
/B(A*?)/ => 'B'
将“?”添加到+和*运算符会使它们“懒惰”-即它们将匹配表达式为真所需的绝对最小值。而默认情况下,*和+运算符是“贪婪”的,并尝试尽可能多地匹配以使表达式为真

记住+表示“一个或多个”,因此最小值为“一个如果可能,多个如果绝对必要”,而最大值为“所有如果可能,一个如果绝对必要”


和*表示“零或更多”,因此最小值将是“可能的话什么都没有,绝对必要的话更多”,而最大值将是“可能的话全部,绝对必要的话零”。

我想这很大程度上取决于实现情况。但是,由于我所知道的每个量词都可以用
修改,因此用这种方式实现它可能是合理的。

在不同的上下文中可能意味着许多不同的事情

  • 在一个普通的正则表达式标记(一个字符、一个速记、一个字符类、一个组…)之后,它意味着“将前面的项匹配0-1次”
  • 在像
    *
    +
    {n,m}
    这样的量词后面,它有一个不同的含义:“让前面的量词变懒,而不是变贪婪(如果这是默认值;但是可以更改,例如在PHP中,
    /U
    修饰符默认情况下使所有量词变懒,因此附加的
    使它们变贪婪)
  • 在右括号之后,它标志着一个特殊构造的开始,例如

    a)
    (?s)
    :模式修改器(“打开点播模式”)
    b)
    (?:…)
    :使组不被捕获
    c)
    (?=…)
    (?!…)
    :先行断言
    d)
    (?
    e) 
    (?>…)
    :原子群
    f)
    (?…)
    :命名捕获组
    g)
    (?#comment)
    :内联注释,被正则表达式引擎忽略
    h)
    (?(?=if)then | else)
    :条件句

并非所有的构造都可以在所有的正则表达式中使用

  • 在字符类(
    [?]
    )中,它只是逐字匹配

我认为一点历史会让它更容易理解。当Larry Wall想要扩展正则表达式语法以支持新功能时,他的选择受到了严重限制。他不能仅仅命令(例如)
%
现在是一个支持新功能“XYZ”的元字符“。这将打破数百万个碰巧使用
%
匹配文字百分比符号的现有正则表达式

他所能做的就是使用一个已经定义好的元字符,并以其原始功能无法理解的方式使用它。例如,任何在一行中包含两个量词的正则表达式都是无效的,因此在另一个量词将其变成不情愿的量词后,可以安全地说是
(比“lazy”IMO更好的名称;也是非贪婪的好名称)。所以你的问题的答案是,
不会修改
*
*?
是一个单独的实体:一个不情愿的量词。所有格量词中的
+
*+
{0,2}+
等)也是如此

组语法也出现了类似的过程。在未替换的左括号后面加一个量词是没有意义的,所以可以安全地说
(?
现在标志着一个特殊组构造的开始。但是问号本身只支持一个新功能,因此要跟随的
本身必须至少后跟一个字符,以指示它是哪种组(
(?:…)
(?),等等)。同样,
(?:
是单个实体:非捕获组的开头分隔符


我不知道他为什么两次都使用问号。我知道(Perl 5正则表达式的自下而上重写)已经消除了所有这些废话,并使用了一种更加合理的语法。

{0,1}的缩写
@TheNewIdiot本身,是的。但是在*或+之后,它有不同的效果。然而,我确实想知道,是否有任何正则表达式引擎能够识别
{n,m}?
语法?@PP它似乎是以我认为基于php的方式工作的。@Uriel,这个新的白痴在谈论
量词,它相当于
{0,1}
量词,就像
*
相当于
{0,}
等。你不能像那样链接量词;这是一个语法错误。
*?
中的
似乎是一个量词修饰符或(这是大多数文档似乎都说的),
*?
只是另一个类似于
*
的量词,除了懒惰。@PP,我认为所有提供非贪婪量词的重要引擎,也提供
{n,m}?