3

次のようなテキストがあるとします。

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

|の後の「-」の数を数えたい。perlで次の正規表現を使用して解析しようとしました

$count=()= /-/g;

しかし、最初の 2 つは "-" がテキストの別の場所と前にあるため、問題があります。「|」の直後に「-」の数を取得するには、どのように正規表現を作成するか、perl で他の関数を使用する必要がありますか?

4

4 に答える 4

3

開始後のダッシュに一致する正規表現|
/^\|([\-]*)/

于 2013-01-28T18:51:26.453 に答える
1

縦線が最初にしか来ない場合は、次のようにしてマイナスを繰り返す文字列を取得できます。

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

$match を囲む括弧により、正規表現のキャプチャされた部分がそれに入れられます

次に、を使用してマイナスの数を取得します

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

|| '')

少し

上記の正規表現で一致がまったく見つからなかった場合に $match を初期化して、初期化されていない変数に関する長さのうめき声を停止します (警告がオンになっている場合)

于 2013-01-28T20:36:31.347 に答える
1

文字が前に付いていないダッシュをカウントするには、否定の後読みアサーションを使用します

$count = () = /(?<!\w)-/g
于 2013-01-28T20:04:08.707 に答える
-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 に答える