2012-10-03 11 views
6

〜C++クラスのメンバの名前であるような特殊文字が含まれていない限り、細かい単語にマッチする正規表現があります。 1文字のメンバー名には、次のように単語境界を使用する必要があります。 $key =~ /\b$match\b/特殊文字で始まる単語境界に一致する正規表現

私は、このような/[~]*\b$match\b//\b[~]*$match\b/

として働くだろうと思った数多くの表現をしようとした特殊文字が含まれていてもよい言葉で単語の境界を置くために、それは可能ですか?あなたは、単語の文字として~を扱う[\w~]\wを変更したい場合は

+1

あなたがマッチさせたいものを正確に投稿することができます。文字列が何であるかを仮定するだけでなく、正規表現が特定のケースに対して生成されます。 –

+1

'/〜\ b $ match \ b/'は'〜Query'にマッチするはずです。 '$ match'に含まれている正規表現は' Query'とマッチします。 (私はちょうどテストし、 '"〜foo "=〜/〜\ bfoo \ b /'は真と評価します) – cdhowie

+0

$一致変数は〜クエリ、クエリ、またはpのような単一の文字を含むかもしれません。他の奇妙な名前の開発者がクラスメソッドに使用する可能性があります。正規表現は検索を行っているサブルーチンの一部です。 $ matchに〜Queryが含まれている場合を除き、すべて正常に動作します。 –

答えて

10
\b 

(?:(?<!\w)(?=\w)|(?<=\w)(?!\w)) 

の略です。

(?:(?<![\w~])(?=[\w~])|(?<=[\w~])(?![\w~])) 

使用例:

my $word_char = qr/[\w~]/; 
my $boundary = qr/(?<!$word_char)(?=$word_char) 
        |(?<=$word_char)(?!$word_char)/x; 

$key =~ /$boundary$match$boundary/ 

我々は$matchだけ始まり、$word_charで終わるものを一致させることができ、次のように、私たちが簡素化することができます知っている場合:

my $word_char = qr/[\w~]/; 
my $start_bound = qr/(?<!$word_char)/; 
my $end_bound = qr/(?!$word_char)/; 

$key =~ /$start_bound$match$end_bound/ 

これは十分に簡単です私たちはインラインでできる。

あなたは、単に $matchの文字列がないことを確認し、この

$key =~ /(?<![~\w])$match(?![~\w])/ 

を書くことができます(すなわち、それは常に有効な識別子を含む)あなたは$matchの内容を確認する必要はありませんと仮定すると、

$key =~ /(?<![\w~])$match(?![\w~])/ 
+0

ありがとうございます。 $?= [/ w?])(?= [\ w〜]))$(=!) (?:[\ w〜]))/) –

+1

私がする必要がある場合(?:(?<= [\ w〜])他の特殊文字を追加すると、[\ w〜 '] –

+1

yupのように追加されます。 xxxxxxxxxx – ikegami

4

英数字、アンダースコア、チルダの前または後ろ

関連する問題