我有数据这样的:Perl第一对匹配?
a{b}cde
a{b}c{d}e
我要洒串分为三个部分:
- 串第一{}对
- 在第一{}对字符串之前
- 休息
这里是我的代码:
(。*?)if(/(.*){(.*)}(.*)/){
print "$1\t$2\t$3\n"; # ===> a{b}c d e
}
但它不工作了a{b}c{d}e
我想a b c{d}e
,而不是a{b}c d e
我有数据这样的:Perl第一对匹配?
a{b}cde
a{b}c{d}e
我要洒串分为三个部分:
这里是我的代码:
(。*?)if(/(.*){(.*)}(.*)/){
print "$1\t$2\t$3\n"; # ===> a{b}c d e
}
但它不工作了a{b}c{d}e
我想a b c{d}e
,而不是a{b}c d e
制作*非贪婪会做的伎俩:
#!/usr/bin/perl
use strict;
use warnings;
while (my $line = <DATA>) {
if($line =~ m/(.*?){(.*?)}(.*)/){
print "$1\t$2\t$3\n";
}
}
__DATA__
a{b}cde
a{b}c{d}e
虽然在这种情况下非贪婪的匹配工作,我会主张使用否定字符类。这更明确地指出,您需要一系列非}
字符,而不是任何字符的最短可能序列,然后是}
。
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
while (<DATA>) {
say "$1\t$2\t$3" if /^([^{]*){([^}]*)}(.*)/;
}
__DATA__
a{b}cde
a{b}c{d}e
Dave,否定性格类更快? – 2013-03-27 08:33:35
@MauritzHansen:原则上,它可以是因为它严重降低(或者,在这种情况下,完全消除)正则表达式引擎可能需要回溯才能找到正确匹配的可能性。实际上,Perl正则表达式引擎优化得相当厉害,所以我认为在非病态的情况下应该没有明显的性能差异。 – 2013-03-27 10:22:15
那么通过“第一对”你是指“最后一对”? – 2013-03-27 07:36:04
不,第一个:他的例子显示了一个(在第一对之前)和b(在第一对之内)和c {d} e(在第一对之后) – 2013-03-27 12:27:03
您应该真正地逃脱裸露的'{'和'}'。使用'\ {'或'[{]'。 – 2013-03-29 21:47:20