3

假设有这样的文本:

|-SAMPLE-D2
|---SAMPLE-D1
|---SAMPLE3

我想计算|之后的“-”个数。我试图通过在 perl 中使用以下正则表达式来解析它

$count=()= /-/g;

但这是有问题的,因为前两个在文本的其他地方以及前面都有“-”。我应该如何形成我的正则表达式或在 perl 中使用其他函数来获取“|”之后的“-”数量?

4

4 回答 4

3

正则表达式匹配开始后的破折号|
/^\|([\-]*)/

于 2013-01-28T18:51:26.453 回答
1

要计算前面没有字母的破折号,请使用否定的后视断言

$count = () = /(?<!\w)-/g
于 2013-01-28T20:04:08.707 回答
1

如果垂直线只出现在开头,您可以获得重复减号的字符串:

my ($match) = $txt =~ /^\|(-*)/;

$match 周围的括号导致将正则表达式的捕获部分放入其中

然后使用

my $minus_count = length($match || '');

|| '')

少量

如果上面的正则表达式根本找不到匹配项,则初始化 $match,以停止对未初始化变量的长度抱怨(如果您有警告)

于 2013-01-28T20:36:31.347 回答
-1

不确定您是否可以直接计算正则表达式,但您可以提取捕获组并对其字符串长度进行简单的算术运算:

#!/usr/bin/perl
use warnings;
my $inFile = $ARGV[0];
open(FILEHANDLE, "<", $inFile) || die("Could not open file ".$inFile);
my @fileLines = <FILEHANDLE>;
my $lineNo = 0;
my $rslt;

foreach my $line(@fileLines) {
    chomp($line);
    $line =~ s/^\s+//;
    $line =~ s/\s+$//;
    $lineNo++;
    print "\n".$lineNo." = <".$line.">";
    if($line =~ m/^\|-+(.+)/) {
        my $text = $1;
        print "\n\ttext = <".$text.">";
        my $minCnt = length($line) - length($text) - 1;
        print "\n\tminus count = <".$minCnt.">";
    }
}
close(FILEHANDLE);
于 2013-01-28T19:00:59.770 回答