2012-11-05 10 views
6

私はregexpにマッチした文字列を、空白で囲まれた文字列の途中に置かなければなりません。文字列中の唯一のものでなければなりません。Perl regexpを使って、文字列の最後か最後にスペースで区切られた単語をどのように一致させるか?

例: シーケンス'qwe45rty'が私たちが探しているものとしましょう。私は、これらの文字列のすべてにプラスを取得することができるようにしたい:

'qwe45rty''qwe45rty blabla''smth qwe45rty blabla''smth qwe45rty'' qwe45rty '

しかし、これらのどれも:私が思い付いたベスト

'aaqwe45rty''qwe45rtybb''aaqwe45rtybb'

このようなsmth:

if (($a =~ /\s+$re\s+/) or 
    ($a =~ /^$re\s+/) or 
    ($a =~ /\s+$re$/) or 
    ($a =~ /^$re$/)  ) 
{ 
    # do stuff 
} 

これは最善の方法ではありません。

お勧めはありますか?例えば

$a =~ /(?:\A|\s)$re(?:\s|\Z)/; 

答えて

17

はあなたが行うことができますまたは正規表現の内側

/(^|\s+)qwe45rty(\s+|$)/ 
+1

私は正規表現の中で 'または'について知っていますが、 '^'と '$'という文字列アンカーは使用できないと思いました。 – bazzilic

+2

@bazzilic私はこの方法で問題なくアンカーを使用しました。唯一の問題は、目的を照合するためにかっこを使用している場合、かっこがカウントに追加されることです。この問題を回避するには '(?:^ | \ s +)'を使うことができます。 –

+0

あなたの解決策を選んだので、文字列アンカーをPerl正規表現の他の制御シーケンスとして使用できることを教えてくれてありがとう! – bazzilic

1

は、次の試してみてください

use strict; 
use warnings; 

my $re = 'qwe45rty'; 
while (<DATA>) { 
    chomp; 
    print "'$_': Match? " . (/(?:\A|\s)$re(?:\s|\Z)/ ? 'Yes' : 'No') . "\n"; 
} 

__DATA__ 
qwe45rty 
qwe45rty blabla 
smth qwe45rty blabla 
smth qwe45rty 
qwe45rty 
aaqwe45rty 
qwe45rtybb 
aaqwe45rtybb 

出力:

'qwe45rty': Match? Yes 
'qwe45rty blabla': Match? Yes 
'smth qwe45rty blabla': Match? Yes 
'smth qwe45rty': Match? Yes 
' qwe45rty ': Match? Yes 
'aaqwe45rty': Match? No 
'qwe45rtybb': Match? No 
'aaqwe45rtybb': Match? No 
+1

ワード境界は必ずしも解決策ではありません。もし '$ re'が' [a-zA-Z0-9!〜] 'なら? – bazzilic

+1

@bazzilic - 優秀なキャッチ!元の '$ a =〜/ \ bqwe45rty \ b;'があなたのキャラクタセットで失敗するのは間違いありません。これを私の目に留めてくれてありがとう。改訂された正規表現はより堅牢です。 – Kenosis

+0

これは実際に@AndreKRが提案したものですが、 '(?:...)'に感謝します - 私は以前これに慣れていませんでした。有用! – bazzilic

6

別の方向から問題を試してみてください。何かできマッチ空白または何も言うことは、それがは非空白文字と一致しないことができると言うことです:

(?<!\S)qwe45rty(?!\S) 

だけの視点で少しシフトして正規表現は、実質的に自分自身を書き込みます。

+0

これは素晴らしいです、アラン。 – Kenosis

+0

ええ、Perlは最高です - TIMTOWTDI :)あなたの提案をありがとう! – bazzilic

関連する問題