Perl中的正则表达式分组

时间:2013-08-19 15:41:35

标签: regex perl

我的变量包含:No such file or directory at ./EMSautoInstall.pl line 50.

我想创建包含No such file or directory的变量,另一个包含at ./EMSautoInstall.pl line 50.

我的REGEX是:my ( $eStmnt, $lineNO ) = $! =~ /(.*[^a][^t])(.*)/;

当我打印两个变量时,第一个变量包含No such file or directory但第二个变量为空。

为什么会这样?

3 个答案:

答案 0 :(得分:7)

真的$!变量中有那个字符串吗?通常,at line...部分由diewarn添加。我怀疑你只是

$! = "No such file or directory";

你的正则表达式匹配,因为它允许空字符串

/(.*[^a][^t])(.*)/

即。第二次捕获也不匹配,第一次捕获可以是任何不以at结束的捕获。

确认,

print $!;

应打印No such file or directory

答案 1 :(得分:2)

在这里使用split前瞻断言比正则表达式捕获更有意义:

my ( $eStmnt, $lineNO ) = split /(?=at)/, $!;

答案 2 :(得分:1)

您可以使用:

((?:[^a]+|\Ba|a(?!t\b))+)(.*)

这个想法是匹配所有不是“a”或“a”的东西,而不是“at”这个词的一部分

细节:

(                 # first capturing group
    (?:           # open a non capturing group
        [^a]+     # all that is not a "a" one or more times
      |           # OR
        \Ba       # a "a" not preceded by a word boundary
      |           # OR
        a(?!t\b)  # "a" not followed by "t" and a word boundary
    )+            # repeat the non capturing group 1 or more times
)                 # close the capturing group
(.*)              # the second capturing group  

您可以改进此模式,用原子组替换非捕获组,用占有量量词替换量词。目标是禁止正向引擎位置的正则表达式引擎记录,但结果保持不变:

((?>[^a]++|\Ba|a(?!t\b))++)(.*+)