缩短Perl的RegEx

时间:2011-01-28 08:59:44

标签: regex perl language-agnostic

我在Perl中创建了一个长度约为95个字符的正则表达式,我希望将其缩短为78个字符,但找不到合适的方法。任何欢迎的建议,正则表达式类似于下面的代码,理想情况下,在C中有类似于\的东西。

my ($foo, $bar, $etc) = $input_line =~ 
/^\d+: ....  (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/

3 个答案:

答案 0 :(得分:2)

有一种方法可以告诉正则表达式跳过嵌入的空格和注释,这样不仅可以将它分成多行,还可以对它进行注释,将其格式化为部分等等。我认为它是'x',但我不喜欢现在没有方便的文档,所以请在手册页中查找。

所以你要把它改成像:

my ($foo, $bar, $etc) = $input_line =~ /
        ^\d+: ....
        (\X+)\(
            \X(\d+.\d+|\d+) # numerator
            \/\X(\d+.\d+|\d+) # denominator
            \ (\X+)\)$/x # mind the escaped space!

也可以通过'qr'字符串前缀分别构造正则表达式的片段,并使用变量替换它们组合。像

这样的东西
my $num_re = qr/(\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+)/;
my ($foo, $bar, $etc) = $input_line =~ /^\d+: ....  $num_re (\X+)\)$/;

我没有这么久,所以我不确定你是否需要任何标志。

答案 1 :(得分:0)

Perl插入正则表达式,所以你可以做这样的事情

my $input_line = '123: ....  X(X1.1/X5 XXX)';

 my $dOrI = '(\d+.\d+|\d+)';
 my ($foo, $bar, $etc) = $input_line =~ 
 /^\d+: ....  (\X+)\(\X$dOrI\/\X$dOrI (\X+)\)$/;

print "$foo, $bar, $etc";

输出 -

X, 1.1, 5

答案 2 :(得分:0)

我在正则表达式中看到的一件事是'\ d +。\ d +'中的句号。

你知道'。'在正则表达式中匹配任何字符,而不仅仅是实际的句点字符。

如果您只想指定一个实际的句点字符,则必须使用'\。'代替。

另一件事是你可以用'\ d +替换'\ d +。\ d + | \ d +'。?\ d +'

[编辑] 还有一件事,如果您不止一次使用插值的正则表达式并且在两次使用之间不改变它(例如,在循环中),您应该使用/ o选项让Perl编译整个正则表达式,这样它就不会需要每次编译。