BabelとUnicode正規表現で最新JavaScript機能を古いブラウザで利用する
JavaScriptでUnicode対応正規表現を使用する方法
uフラグを使用する
最も簡単な方法は、正規表現リテラルまたはRegExp
コンストラクタにu
フラグを指定することです。
// 例1: 正規表現リテラル
const regex = /𠮷/u;
// 例2: RegExpコンストラクタ
const regex = new RegExp("𠮷", "u");
u
フラグを設定すると、以下の効果があります。
- 文字列がUnicodeコードポイントのシーケンスとして解釈されます。
- Unicodeプロパティエスケープを使用できます。
- スクリプトの境界が考慮されます。
String.prototype.matchAllを使用する
String.prototype.matchAll
メソッドは、Unicode対応正規表現を使用して、文字列内のすべてのマッチング部分文字列を見つけることができます。
const str = "𠮷野家";
const matches = str.matchAll(/𠮷/u);
for (const match of matches) {
console.log(match[0]); // "𠮷"
}
Unicodeプロパティエスケープを使用すると、特定のUnicode文字プロパティを持つ文字にマッチさせることができます。
// 例1: 日本語文字にマッチ
const regex = /[^\p{Script=Latin}]/u;
// 例2: 数字にマッチ
const regex = /\p{Number}/u;
// 例1: 日本語の𠮷にマッチ
const regex = /𠮷/u;
const str = "𠮷野家";
console.log(regex.test(str)); // true
// 例2: スクリプト境界を考慮
const regex = /\p{Script=Latin}/u;
const str = "𠮷A";
console.log(regex.test(str)); // false
const str = "𠮷野家";
const matches = str.matchAll(/𠮷/u);
for (const match of matches) {
console.log(match[0]); // "𠮷"
}
// 例1: 日本語文字にマッチ
const regex = /[^\p{Script=Latin}]/u;
const str = "𠮷野家";
console.log(regex.test(str)); // true
// 例2: 数字にマッチ
const regex = /\p{Number}/u;
const str = "123𠮷";
console.log(regex.test(str)); // true
- 上記のコードは、あくまでもサンプルです。
- 使用する前に、
u
フラグとUnicodeプロパティエスケープのサポート状況を確認する必要があります。
js-regex
やpcre.js
などの正規表現ライブラリは、JavaScript標準の正規表現機能よりも多くの機能を提供しており、Unicode対応正規表現も簡単に使用できます。
Babelを使用する
BabelはJavaScriptのコンパイラであり、u
フラグやUnicodeプロパティエスケープなどの新しいJavaScript機能を古いブラウザで動作させることができます。
Polyfillを使用する
unicode-match
やunicode-regex
などのPolyfillを使用すると、古いブラウザでもUnicode対応正規表現を使用することができます。
各方法の比較
方法 | メリット | デメリット |
---|---|---|
u フラグ | 最も簡単 | 古いブラウザではサポートされない |
String.prototype.matchAll | 複数のパターンにマッチする必要がある場合に便利 | 古いブラウザではサポートされない |
Unicodeプロパティエスケープ | 詳細なパターンマッチが可能 | 複雑なコードになる可能性がある |
正規表現ライブラリ | 多くの機能を提供 | 導入コストがかかる |
Babel | 古いブラウザで新しい機能を使用できる | 設定が複雑になる可能性がある |
Polyfill | 古いブラウザでUnicode対応正規表現を使用できる | 動作が遅くなる可能性がある |
javascript regex unicode