我在Perl中创建了一个长度约为95个字符的正则表达式,我希望将其缩短为78个字符,但找不到合适的方法。任何意见欢迎,正则表达式类似于下面的代码,最好有类似的东西在C到\缩短Perl的正则表达式
my ($foo, $bar, $etc) = $input_line =~
/^\d+: .... (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/
我在Perl中创建了一个长度约为95个字符的正则表达式,我希望将其缩短为78个字符,但找不到合适的方法。任何意见欢迎,正则表达式类似于下面的代码,最好有类似的东西在C到\缩短Perl的正则表达式
my ($foo, $bar, $etc) = $input_line =~
/^\d+: .... (\X+)\(\X(\d+.\d+|\d+)\/\X(\d+.\d+|\d+) (\X+)\)$/
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
有一种方式来告诉正则表达式来跳过嵌入空白和注释,这样不仅可以拆分它可以分为多行,但也可以对它进行注释,格式化为章节等。我认为它是'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+)\)$/;
我还没有这么长时间,所以我不确定是否需要任何标志。
一件事,我在正则表达式看到的是“\ d +周期\ d +”。
你知道'。'在正则表达式中匹配ANY字符,而不仅仅是实际的字符。
如果您只想指定实际的句点字符,则必须使用'\'。代替。
的另一件事是,你可能能够取代 '\ d + \ d + | \ d +' 与 '\ d + \ d +?'
[编辑] 还有一件事,如果你使用插入正则表达式不止一次,并且不会在两次使用之间改变它(例如,在一个循环中),您应该使用/ o选项让Perl编译整个正则表达式,因此无需每次都编译。
*为什么*要将表达式缩短为* 78 *个字符?为什么不是79或77? – thkala 2011-01-28 09:01:18
哦,如果我们知道表达式(顺便说一下,你做了*不*后)应该做什么,我们可能会帮助你更多。 – thkala 2011-01-28 09:02:24
@thkala - 可能是因为某些编码风格要求这些行包含不超过79个字符(最好是78)? – eumiro 2011-01-28 09:05:44