Perl正则表达式 - 如何减少贪心?

Jea*_*ean 6 regex perl

如何计算以下字符串中空'字段'的数量?空字段以表示-||-||- 我已经熟了的正则表达式看来除非我有连续的空场是工作?我如何减少贪心?

my $string = 'P|CHNA|string-string|-|-|25.75|-|2562000|-0.06';
my $count = () = ($string=~/(?:^-\||\|-$|\|-\|)/g);   
printf("$count\n");
Run Code Online (Sandbox Code Playgroud)

上面的代码打印2而不是我想要的3.

AKH*_*and 7

我完全避免使用正则表达式路由,而是将其视为列表,因为它是一个:

my $count = grep { /^-$/ } split /\|/, $string;
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 2

诀窍是使用环视。有人的第一次尝试可能如下:

my $count = () = $string =~ /
   (?<\|)  # Preceded by "|"
   (-)
   (?=\|)  # Followed by "|"
/xg;
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。上面的问题是它没有检测第一个字段或最后一个字段是否为空。有两种方法可以解决这个问题:

my $count = () = "|$string|" =~ /
   (?<\|)  # Preceded by "|"
   (-)
   (?=\|)  # Followed by "|"
/xg;
Run Code Online (Sandbox Code Playgroud)

或者

my $count = () = $string =~ /
   (?<![^|])  # Not preceded by a char other than "|"
   (-)
   (?![^|])   # Not followed by a char other than "|"
/xg;
Run Code Online (Sandbox Code Playgroud)