0

我有这样的数据:

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

4

2 回答 2

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
于 2013-03-27T07:43:48.420 回答
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
于 2013-03-27T08:19:46.070 回答