C++ クラスのメンバーの名前である ~Query などの特殊文字が含まれている場合を除いて、単語に適切に一致する正規表現があります。1 文字のメンバー名には、以下に示すように単語境界を使用する必要があります。
$key =~ /\b$match\b/
/[~]*\b$match\b/
orなど、機能すると思われる表現を数多く試しました/\b[~]*$match\b/
特殊文字を含む可能性のある単語に単語境界を置くことは可能ですか?
\b
の略です
(?:(?<!\w)(?=\w)|(?<=\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
で始まり a で終わるものにのみ一致することがわかっている場合は$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/
これは、インライン化できるほど単純です。
$key =~ /(?<![\w~])$match(?![\w~])/
の内容をチェックする必要がないと仮定すると$match
(つまり、常に有効な識別子が含まれている)、次のように記述できます。
$key =~ /(?<![~\w])$match(?![~\w])/
$match
これは、文字列の前後に英数字、アンダースコア、またはチルダがないことを単純にチェックします