正規表現の特殊文字\bとは
JavaScript正規表現の特殊文字\bは単語区切りにマッチします。
正規表現\bの「単語区切り」をスペースだけのことだと勘違いしている人が多いがこれは間違い。
確かにThis pen is mine.という文字列は/\bpen\b/にマッチします。
しかし、/\bpen\b/はI have a pen.という文字列のpenにもマッチするのです。
これは「.」「!」「?」も\bの単語区切りのため。ちなみに全角や絵文字の「!」「?」も単語区切りとなる。
var p = prompt( `文字列を入力してください。 /\bpen\b/にマッチするかテスト 例: This is a pen.` ); if (/\bpen\b/.test(p)) { alert(`Match! ${p}`); } else { alert(`Unmatch... ${p}`); }
JavaScriptでは日本語も単語区切りになる
JavaScript以外の言語では日本語は単語区切りにならないが、JavaScriptでは日本語も単語区切りになる。
例えば/A\b/は他の言語なら「Aクラス」をマッチしないがJavaScriptだとマッチしてしまう。
JavaScript
var p = prompt( `文字列を入力してください。 /A\b/にマッチするかテスト 例: Aクラス` ); if (/A\b/.test(p)) { alert(`Match! ${p}`); } else { alert(`Unmatch... ${p}`); }
Perl
use v5.22; say "文字列を入力してください。 \/A\\b\/にマッチするかテスト 例: Aクラス"; while(<>) { if (/(A\b)/) { say "Match! $_"; } else { say "Unmatch... $_"; } }
アクセント付き文字も単語区切り
JavaScript以外の言語ではアクセント付き文字は単語区切りにならないが、JavaScriptではアクセント付き文字も単語区切りになってしまう。
アクセント付き文字とはéのようにアクセント(アキュート)を付与した文字でフランス語、スペイン語などで使用される。
例えば/caf\b/とした場合、「cafe」にはマッチしないが「café」にはマッチしてしまう。
JavaScript
var s1 = 'cafe'; var s2 = 'café'; function regTest(str) { if (/caf\b/.test(str)) { console.log(`Match! ${str}`); } else { console.warn(`Unmatch... ${str}`); } } regTest(s1); // => Unmatch... cafe regTest(s2); // => Match! café
Perl
use v5.22; say "文字列を入力してください。 \/caf\\b\/にマッチするかテスト 例: café"; while(<>) { if (/(caf\b)/) { say "Match! $_"; } else { say "Unmatch... $_"; } }