2017-09-21 14 views
0

blueの後に次の単語ballを抽出します。例えば与えられた単語の後の文字列の次の単語を抽出する方法

I am a blue #(jjkk, djajd)  ball(apple) 

は私がblue後に次の単語を抽出したいです。

期待出力は次のようになります。ball

二つの単語の間に無期限の空白が存在する場合があります。

私が試してみました:これはトリックん

@split_array = split(/\s+/, $'); 

$next_word = $split_array[1]; 
+0

(+ W \)を使用する私の($の部分文字列) 'のようなもの= $文字列=〜/ \ bblue \ S + /;' –

答えて

1

use strict; 

my $input = 'I am a blue ball(apple)'; 

if ($input =~ /\bblue\s+(\w+)/) { 
    my $found = $1; 
    print "Word found after word 'blue': $found \n";  
} else { 
    print "No word after word 'blue' present\n"; 
} 
(更新#1 Dave Cross経由 blueの前で \bを使用するには、文字列の先頭に一致することができます)

出力:

Word after word 'blue' found: ball 

更新#2:blueの後に2番目または3番目の単語を一致させるにはどうすればよいですか?

\bblue\s+(\w+)から\bblue\s+\w+\s+(\w+)に2番目の単語の正規表現を変更します。

対応して、第3の入力には\bblue\s+\w+\s+\w+\s+(\w+)を使用します。

これは短く書くことができますが、複雑さを避けるために書いていません。

+1

はおそらく、 '\ B'と開始時に' \ S + 'を交換してください(中ケース言葉は、文字列の最初の単語である –

+0

おかげで、それはより一般的なソリューションです – zb226

+0

おかげで...私が何をすべき変更内容青後の第二または第三の単語をしたい場合 –

0

まず、文字列を一致させてみてください。ここではblueです。それは始まりにあるかもしれない。そうでない場合は、前にスペースが続きます。

/(^|)blue/

次に、次の単語を検索します。単語はスペースまたは行の末尾に続く文字のグループであるとして:

/([\w]+)(|$)/ 

は、それらを一緒に参加し、そして唯一の検索単語を抽出します。

/(?:^|)blue ([\w]+)(?: |$)/ 

あなたは変数で「青」を交換することができます。

以下のコメントで示唆したように、\bで初めを簡略化し、「1つ以上のスペースまたはタブ」と表現を絞り込むことが可能である(\s+):

/\b$searched_word\s+([\w]+)(?:\s+|$)/ 
+2

'(^ |)'はおそらく '\ b'で置き換えられます。そして、OPの中には "二つの単語の間に空白があるかもしれない"と言われているので、単語の間にあるリテラルスペースはおそらく '\ s +'でなければなりません。 –

1

あなたはのカップルを持っていますこれを行う正しい方法を示す正規表現ベースのソリューションです。私たちがあなたのソリューションを構築できるかどうかは興味深いと思っていました。

文字列に単語の配列を作成します。それはうまく動作します。

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use Data::Dumper; 

$_ = 'I am a blue ball(apple)'; 

my @split_array = split /\s+/, $_; 

say Dumper \@split_array; 

います:

$VAR1 = [ 
      'I', 
      'am', 
      'a', 
      'blue', 
      'ball(apple)' 
     ]; 

をあなたがその単語を取得するために$split_array[1]を使用しています。もちろんそれは正しい言葉ではありません。 $split_array[1]は配列の2番目の要素です。これは "am"です。

あなたがしたいことは、配列を歩いて "青"を探して、次の文字列を取得することです。このような何か:

foreach (0 .. $#split_array - 1) { 
    if ($split_array[$_] eq 'blue') { 
    say "The next word is $split_array[$_ + 1]"; 
    } 
} 

$#split_array私たち(4)@split_arrayの最後の要素のインデックスを提供します。私たちはの後にの後に "blue"と言いたいので、それから1を引いて、最後の単語の後には単語がありません。

その印刷物:

あなたが望むものではありません
The next word is ball(apple) 

。だから何がうまくいったの?さて、splitへの元の呼び出しです。空白に分かれていて、 "ボール"と "リンゴ"の間に空白がありません。では、代わりに\W+(単語以外の文字)に分割してみましょう。

その後、我々は我々の配列内の余分なアイテムを取得:

$VAR1 = [ 
      'I', 
      'am', 
      'a', 
      'blue', 
      'ball', 
      'apple' 
     ]; 

正解。

The next word is ball 
関連する問題