0

以下の例に示すような文があります。

$sen1 = "The quick brown fox jump KEYWORD over123 the3 lazy dog, fox is quick";

$sen2 = "The quick brown fox jump123 KEYWORD over the lazy dog, fox is quick"; 

キーワード「KEYWORD」を検索文字列として使用して、Perl 正規表現を使用して検索文字列の前後の英数字の単語を抽出したいと考えています。

出力例:

オーバー123

ジャンプ123

注: 「キーワード」の直前または直後の英数字のみを検索しているため、「the3」という単語は除外されています。

ありがとう

4

3 に答える 3

1

名前付きキャプチャ メソッドを使用できるため、ケースが 1 つしか存在しない場合に $1 または $2 をチェックする必要はありません。(?<before>[\w\d]+)?\s*KEYWORD\s*(?<after>[\w\d]+)?

my $str = <<DAT;
The quick brown fox jump KEYWORD over123 the3 lazy dog, fox is quick
The quick brown fox jump123 KEYWORD over the lazy dog, fox is quick
The quick brown fox jump123 KEYWORD over123 the lazy dog, fox is quick
The quick brown fox jump123KEYWORDover123 the lazy dog, fox is quick
DAT

foreach (split(/\n/,$str)){
    if(/(?<before>[\w]+)?\s*KEYWORD\s*(?<after>[\w]+)?/){
        print $+{before} . "-" . $+{after} . "\n";
    }
}
于 2012-10-02T04:11:53.857 に答える
1

文字列に 1 回だけ現れるキーワードがある場合、次のように使用できます。

my $string = 'The quick brown fox jumps123 KEYWORD over the lazy dog';

my ( $w_before, $w_after ) = $string =~ m/(\w+)\s*KEYWORD\s*(\w+)/;
# $w_before == jumps123
# $w_after == over

英数字とは、文字または数字または両方の組み合わせのいずれかを意味していると思います。その場合、それ\wを行うことができます。\s*また、KEYWORD と前後の単語の間にスペースがある場合に備えて入れます。

私が書いたものを使用すると、「何とか」と「foo」という単語を次のようにキャプチャできます。

blahKEYWORDfoo
blah KEYWORD foo
blahKEYWORD foo
blah KEYWORDfoo
blah          KEYWORD      foo
于 2012-10-23T16:00:15.897 に答える
0

どちらのターゲットにもこれ以上厳しい要件はなく、少なくとも 1 つの単語または数字で構成されていると仮定すると、次のようになります。

([\w\d]+)\s+KEYWORD\s+([\w\d]+)

どちらの場合もあなたをすべきです。これにより、前の単語が $1 に、後の単語が $2 に表示されます。

于 2012-10-02T03:58:11.400 に答える