我有这样的数据:
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
我有这样的数据:
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