JavaScript正規表現の単語区切り特殊文字\bを使用する際の注意点

正規表現の特殊文字\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... $_";
  }
}