假设有这样的文本:
|-SAMPLE-D2
|---SAMPLE-D1
|---SAMPLE3
我想计算|之后的“-”个数。我试图通过在 perl 中使用以下正则表达式来解析它
$count=()= /-/g;
但这是有问题的,因为前两个在文本的其他地方以及前面都有“-”。我应该如何形成我的正则表达式或在 perl 中使用其他函数来获取“|”之后的“-”数量?
正则表达式匹配开始后的破折号|
:
/^\|([\-]*)/
要计算前面没有字母的破折号,请使用否定的后视断言。
$count = () = /(?<!\w)-/g
如果垂直线只出现在开头,您可以获得重复减号的字符串:
my ($match) = $txt =~ /^\|(-*)/;
$match 周围的括号导致将正则表达式的捕获部分放入其中
然后使用
my $minus_count = length($match || '');
这
|| '')
少量
如果上面的正则表达式根本找不到匹配项,则初始化 $match,以停止对未初始化变量的长度抱怨(如果您有警告)
不确定您是否可以直接计算正则表达式,但您可以提取捕获组并对其字符串长度进行简单的算术运算:
#!/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);