perl正则表达式只在文本的前面找到模式

时间:2013-01-28 18:47:24

标签: regex perl

假设有这样的文字:

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

我想在|后计算“ - ”的数量。 我试图通过在perl

中使用以下正则表达式来解析它
$count=()= /-/g;

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

4 个答案:

答案 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);