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