Regex 正则表达式Lookbehind不';不能使用量词(';+;';或';*';)

Regex 正则表达式Lookbehind不';不能使用量词(';+;';或';*';),regex,lookbehind,Regex,Lookbehind,我试图在正则表达式中使用lookbehinds,但它似乎并没有像我预期的那样工作。所以,这不是我真正的用法,但为了简化,我将举一个例子。假设我想在一个字符串上匹配“example”,该字符串表示“thisaexample”。因此,根据我对lookbehinds的理解,这应该是可行的: (?<=this\sis\san\s*?)example (?大多数正则表达式引擎不支持lookback断言的可变长度表达式。Amber所说的是正确的,但您可以使用另一种方法来解决它:非捕获括号组 (?&l

我试图在正则表达式中使用lookbehinds,但它似乎并没有像我预期的那样工作。所以,这不是我真正的用法,但为了简化,我将举一个例子。假设我想在一个字符串上匹配“example”,该字符串表示“thisaexample”。因此,根据我对lookbehinds的理解,这应该是可行的:

(?<=this\sis\san\s*?)example

(?大多数正则表达式引擎不支持lookback断言的可变长度表达式。

Amber所说的是正确的,但您可以使用另一种方法来解决它:非捕获括号组

(?<=this\sis\san)(?:\s*)example

(?许多正则表达式库只允许在look-behind断言中使用严格表达式,如:


  • 仅匹配相同固定长度的字符串:
    (?嘿,如果您没有使用python变量look-behind断言,您可以通过使用
    \K
    转义匹配并重新开始来欺骗正则表达式引擎

    这个网站解释得很好

    但是,当您有一个匹配的表达式,并且希望使用\K获取其背后的所有内容时,将迫使它重新开始

    例如:

    string = '<a this is a tag> with some information <div this is another tag > LOOK FOR ME </div>'
    
    string='带一些信息找我'
    

    匹配
    /(\您可以使用子表达式

    (this\sis\san\s*?)(example)
    

    因此,要检索组2,“example”,“regex的
    $2
    ,或者使用格式字符串的
    \2
    (如python的
    re.sub

    这需要一个标记来标识您使用它们的语言或环境。.NET的正则表达式可以毫无问题地处理这个问题。注意!如果您的正则表达式能够像您所希望的那样工作,那么它也将匹配以下示例:
    这是一个示例
    。因此,如果您不想这样做,您应该删除
    micha:uld可能只是将*更改为
    +
    。删除
    在这方面没有任何效果。但实际上,
    *?
    作为量词在这种情况下是无用和不必要的,因为在这之后没有任何空格可匹配,因此
    \s*?
    等同于
    \s*
    。问题只是后面的查找。Lookahead可以是所有支持它的正则表达式引擎中的任何东西。它与
    (?micha,在这种情况下,我更担心的是匹配部分,而不是性能。使用非capuring组时,我平均得到0.02451781毫秒,没有它时平均得到0.02370844毫秒。我不认为这是一个显著的差异。@micha不。它不一样。它是一个非捕获组。我的正则表达式只匹配
    示例
    (没有前导空格),但您的示例包括前导空格。此正则表达式将匹配前面的任何空格。例如
    这是一个[example]
    (方括号表示匹配)。仅仅因为它在非捕获组中,并不意味着它不匹配。它只是意味着它不在通常会在正常括号中捕获的组中捕获。正确的方法是使用
    \K
    ,就像@Leon说的那样。这不起作用。匹配中包括前导空格。只需复制并粘贴它。这对ruby 2.x但是在1.9和jruby 1.7.x上失败了;原始评论:很好,我很惊讶我从来都不知道这个特性。学会在编辑器中格式化代码,你将是无价之宝。在我遇到负面外观的限制后,我列出了一些策略/解决方法。希望它也能帮助其他人!
    (this\sis\san\s*?)(example)