2013-03-27 82 views
0

我有数据这样的:Perl第一对匹配?

a{b}cde 
a{b}c{d}e 

我要洒串分为三个部分:

  1. 串第一{}对
  2. 在第一{}对字符串之前
  3. 休息

这里是我的代码:

(。*?)
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

+0

那么通过“第一对”你是指“最后一对”? – 2013-03-27 07:36:04

+0

不,第一个:他的例子显示了一个(在第一对之前)和b(在第一对之内)和c {d} e(在第一对之后) – 2013-03-27 12:27:03

+0

您应该真正地逃脱裸露的'{'和'}'。使用'\ {'或'[{]'。 – 2013-03-29 21:47:20

回答

3

制作*非贪婪会做的伎俩:

#!/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 
1

虽然在这种情况下非贪婪的匹配工作,我会主张使用否定字符类。这更明确地指出,您需要一系列非}字符,而不是任何字符的最短可能序列,然后是}

#!/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 
+0

Dave,否定性格类更快? – 2013-03-27 08:33:35

+0

@MauritzHansen:原则上,它可以是因为它严重降低(或者,在这种情况下,完全消除)正则表达式引擎可能需要回溯才能找到正确匹配的可能性。实际上,Perl正则表达式引擎优化得相当厉害,所以我认为在非病态的情况下应该没有明显的性能差异。 – 2013-03-27 10:22:15