2011-01-28 56 views
1

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

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

*为什么*要将表达式缩短为* 78 *个字符?为什么不是79或77? – thkala 2011-01-28 09:01:18

+0

哦,如果我们知道表达式(顺便说一下,你做了*不*后)应该做什么,我们可能会帮助你更多。 – thkala 2011-01-28 09:02:24

+0

@thkala - 可能是因为某些编码风格要求这些行包含不超过79个字符(最好是78)? – eumiro 2011-01-28 09:05:44

回答

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

有一种方式来告诉正则表达式来跳过嵌入空白和注释,这样不仅可以拆分它可以分为多行,但也可以对它进行注释,格式化为章节等。我认为它是'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+)\)$/; 

我还没有这么长时间,所以我不确定是否需要任何标志。

0

一件事,我在正则表达式看到的是“\ d +周期\ d +”。

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

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

的另一件事是,你可能能够取代 '\ d + \ d + | \ d +' 与 '\ d + \ d +?'

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