1

私はPerlを初めて使用し、正規表現を使用して、その文字列にあることがわかっている2つのタグ間の文字列を取得しようとしています。私はすでにstackoverflowからさまざまな回答を試しましたが、どれもうまくいかないようです。これが私の例です...

必要なデータは $info 変数にあり、そこから有用なデータを取得したい

my $info = "random text i do not want\n|BIRTH PLACE=Boston, MA\n|more unwanted random text";

上記の文字列の有用なデータは ですBoston, MA。によって文字列から改行を削除しました$info =~ s/\n//g;。今$infoこの文字列を持っています"random text i do not want|BIRTH PLACE=Boston, MA|more unwanted random text"。これを行うと、必要なデータを簡単に取得できると思いました。

必要なデータの取得にご協力ください。|BIRTH PLACE=データの前には常に が続き、が続くと確信しています|。その前後はすべて不要なテキストです。このような質問がすでに回答されている場合は、それも案内してください。ありがとう。

4

4 に答える 4

3

/\|BIRTH PLACE=([^\|]+)\n\|/その周りのすべてを置き換える代わりに、[^\|]+ の 1 つ以上である を検索できますanything that is not a pipe

于 2013-02-08T15:49:34.120 に答える
2
$info =~ m{\|BIRTH PLACE=(.*?)\|} or die "There is no data in \$info?!";
my $birth_place = $1;

これでうまくいくはずです。

于 2013-02-08T15:50:25.987 に答える
1

実際、これらの改行が役に立ったかもしれません。私は次の最初の正規表現に行きました:

/^\|BIRTH PLACE=(.*)$/m

複数行修飾子 ( m) を使用して、文字列の最初と最後で一致させるだけでなく、^行の最初と最後で一致させます。$一体、あなたは本当に夢中になってマッチすることさえできます:

/(?<=^\|BIRTH PLACE=).+$/m

必要な情報だけを取得するには、後読み ( (?<= ... )) を使用して出生地情報であることをアサートします。

1回できるのに、なぜ2回呪うのですか?

したがって、perl では次のようになります。

if ($info =~ m/(?<=^\|BIRTH PLACE=).+$/m) {
    print "Born in $&.\n";
} else {
    print "From parts unknown";
}
于 2013-02-08T16:00:36.473 に答える
1

You have presumably read this data from a file, which is a bad start. You program should look like this

use strict;
use warnings;

use autodie;

open my $fh, '<', 'myfile';

my $pob;
while (<$fh>) {
  if (/BIRTH PLACE=(.+)/) {
    $pob = $1;
    last;
  }
}

print $pob;

output

Boston, MA
于 2013-02-08T16:28:23.610 に答える