2017-01-16 29 views
2

ある単語の後に単語を抽出するPerlプログラムを書くのが難しいです。例えば特定の単語の後に最初の単語を抽出します。

Today i'm not going anywhere except to office. 

私はanywhere後に単語をしたいので、出力はexceptでなければなりません。

私はこの

my $words = "Today i'm not going anywhere except to office."; 
my $w_after = ($words =~ /anywhere (\S+)/); 

を試してみましたが、これは間違っているようです。

+1

で最も完全に文書化されています。 – ssr1012

+1

@ ssr1012:より良い回答が出るかどうかを確認するには、1日か2日待つかもしれません。 – Borodin

+0

@Borodin:OPは、「Jim Garrison」の回答に「役立つ」と言っています。それで私はここで要請した。 – ssr1012

答えて

3

非常に近い:

my ($w_after) = ($words =~ /anywhere\s+(\S+)/); 
^ ^      ^^^ 
    +--------+      | 
    Note 1      Note 2 

注1:割当先をリストする必要があるので、捕捉された項目のリストを返し=~

注2:この正規表現がマッチするanywhere

+0

おかげでジム..それは助ける! – MrAZ

+0

@ジムガリソン '()'の使い方を説明できますか? 'my($ w_after)= $ words =〜/ anywhere \ s +(\ S +)/;'なぜ同じ結果が返されるのか? – mkHun

+2

オペレータの優先順位に使用される@mkHun。この場合、 '=〜'は '='より高い優先度を持ちます。なぜなら、同じ結果を与えるのはなぜでしょうか。 –

-1

後に可能にする1つの以上の空白:

my ($expect) = ($words=~m/anywhere\s+([^\s]+)\s+/); 

^\s+二つの空間

感謝間の言葉。

+0

ありがとう@ ssr1012..itが役立ちます! – MrAZ

-1

あなたはまたのように、句読点を考慮に入れたい場合:

my ($w_after) = ($words =~ /anywhere[[:punct:]|\s]+(\S+)/); 
0

まず、あなたが=の左側の式を囲む括弧を記述する必要があります。

my $words = "Today i'm not going anywhere; except to office."; 

はその後、これを試してください演算子は、正規表現評価のために配列コンテキストを強制する。 perlop文書のm// and //を参照してください。[1]可読性を向上させるために、=~バインディング演算子のあとに かっこを書くこともできますが、=~はかなり高いpriorityを持っているため、必要ありません。

使用POSIX Character Classesword

my ($w_after) = ($words =~/\b anywhere \W+ (\w+) \b /x); 

私は正規表現でとても空白は無視されxを使用しています注意してください。正規表現を正しく固定するには、\bの単語境界も使用してください。

[1]:あなたが(my $a, my $b, my $c, my @rest)の同等としてmy ($a, $b, $c, @rest)を書くことができますが、あなたはまた、(my $a, our $UGLY_GLOBAL, local $_, @_)のようなあなたの変数のスコープを制御することができますので、私はただ便宜上my ($w_after)を書きます。

+1

あなたの答えが正しい間に、OPが必要とするものは 'my($ w_after)'なので、リストコンテキストで代入を行います。私はそれを覚えておくと便利だと思います。 – Sobrique

1

Perl v5.22以降では、\b{wb}を使用すると、自然言語の結果が向上します。パターンは

/anywhere\b{wb}.+?\b{wb}(.+?\b{wb})/ 

「WB」は単語の区切りを意味することができ、そしてそれは、それらの中にアポストロフィを持つ言葉を占めることになるようなプレーンな\bがないことを、「私はよ」。

.+?\b{wb} 

は、それらの単語の区切りを持たない文字の最短非空のシーケンスと一致します。最初のものはあなたのセンテンスのスペースのスパンにマッチします。 2番目のものは「except」と一致します。それはかっこで囲まれているので、完了時には$1に "except"が含まれています。

\b{wb}は、あなたは以下のアップデートから回答を受け取ることができperlrebackslash

関連する問題