Perl RegEx:“ ??”的含义

时间:2019-04-17 18:51:01

标签: regex perl

我几年前写的脚本中有一个正则表达式。

我知道此正则表达式的作用(寻找高于80%的百分比),但我不记得它的含义/原理。我看到使用了三元运算符,并且最后一次使用了封闭的括号匹配,但是例如,我不知道的是pip3.6 install tensorflowjs 的含义:

??

有人可以为我解释这个正则表达式吗?

2 个答案:

答案 0 :(得分:10)

在我回答之前,我想指出,如果您不完全理解嵌入式Perl代码格式(??...)的含义,可能会充满错误。我已经编写了perl regexen已有20多年了,我的自然趋势是总是编写这样的“用例”作为regex结果的过滤器,而不是将perl代码直接嵌入到regex中。 您已被警告。

好吧,让我们把正则表达式分开:

^           # start of text

(           # begin capture group
  \d+         # one or more digits 0-9
)           # end of capture group

%           # literal percent sign character

$           # end of text

(??{        # start embedded perl code

  $^N >= 80   # if last closed match group($^N) is greater than or equal to 80
    ? ''        # then return empty pattern ('') 
    : '^'       # else return start of text (^) pattern

})          # end embedded perl code

其中$^N引用最新的闭合匹配对的值,而(??{ ... })零宽度子句将执行它包装的perl代码,将其返回的值转换为新的正则表达式,添加到原始图案中。

因此,在此示例中,我们匹配一个或多个数字,紧接着是一个百分号字符。然后,如果捕获的值大于或等于80,则针对文本评估一个空模式(有效地使整个模式匹配,返回捕获的值),否则,评估^(开始于文本)模式,该模式在字符串末尾无法匹配,有效地什么也不返回。

注意,通过在您的Perl正则表达式中添加/ x修饰符,您可以将注释直接嵌入到模式中,该模式也将忽略嵌入的空格。我发现这是一个记录复杂的regexen的好方法。)

答案 1 :(得分:7)

$(??{code})执行code,然后将结果替换为正则表达式。在此范围内,$^N被匹配到最新捕获组的任何内容替换,在本例中为(\d+)。然后再次匹配具有此替换的正则表达式。

因此,如果字符串以数字开头,后跟%,则^(\d+)%与此匹配。然后,它执行$^N >= 80 ? '' : '^',用数字替换$^N。如果数字至少为80,则正则表达式将变为^(\d+)%,并且整个匹配成功。但是,如果数字小于80,它将变为^(\d+)%^。由于第二个^在字符串中间不能匹配,因此正则表达式不再匹配。

因此,此正则表达式匹配以百分比开头(至少为80)的字符串。