9

単一の単語を抽出したい文字列がありますが、数値が追加されているため、行ごとに異なる場合があります。

This is string1 this is string
This is string11 
This is string6 and it is in this line

このファイルを解析して、0 から 100 までの「stringXXX」の値を取得したい

# suppose ABC.txt contains the above lines
FH1 = open "Abc.txt"; 
@abcFile = <FH1>;

foreach $line(@abcFile) {
    if ($pattern =~ s/string.(d{0}d{100});
        print $pattern;

上記は行全体を出力します。stringXXX のみを取得したい

4

4 に答える 4

13

あなたはそれをキャプチャする必要があります:

while ($pattern =~/(string(100|\d{1,2}))/g) {
    print $1;
}

説明:

  • 括弧は、その内容を $1 に取り込みます。括弧のセットが複数ある場合、1 番目は $1 にキャプチャされ、2 番目は $2 にキャプチャされます。この場合、$2 には実際の数値が含まれます。
  • \d{1,2} は 1 ~ 3 桁をキャプチャし、0 ~ 99 をキャプチャできます。一致させたい唯一の 3 桁の数字であるため、そこに 100 を追加すると、明示的に 100 をキャプチャできます。

編集: キャプチャされる番号の順序を修正しました。

于 2008-12-08T04:39:10.220 に答える
5

Abc.pl:

#!/usr/bin/perl -w    
while(<>) {
    while (/(string(\d{1,3}))/g) {      
    print "$1\n" if $2 <= 100;
    } 
}

例:

$ cat Abc.txt 
This is string1 this is string
This is string11 
This is string6 and it is in this line
string1 asdfa string2
string101 string3 string100 string1000
string9999 string001 string0001

$ perl Abc.pl Abc.txt
string1
string11
string6
string1
string2
string3
string100
string100
string001
string000

$ perl -nE"say $1 while /(string(?:100|\d{1,2}(?!\d)))/g" Abc.txt
string1
string11
string6
string1
string2
string3
string100
string100

出力の違いに注意してください。何が望ましいかは、ニーズによって異なります。

于 2008-12-08T05:33:05.040 に答える
-1

過剰に指定しないでください。数値部分をキャプチャするには、 (\d+) を使用します。これにより、任意の長さの数がキャプチャされるため、このファイルを提供しているサルが範囲を 999 まで拡大することを決定したときに、カバーされます。また、今書いているときも、後で保守しているときも、それほど考えることはありません。

発信するものには厳格に、受け入れるものには寛大に。

于 2008-12-09T17:51:18.090 に答える
-2

print $pattern を print $& に変更するだけで、既にキャプチャされています。

于 2008-12-08T05:21:20.180 に答える