今後予定されている正規表現機能

ES2015 では、JavaScript 言語に次のような多くの新機能が導入されました。 Unicode による正規表現構文の大幅な改善 (/u)フラグと固定フラグ(/y)フラグ。それ以降、開発が止まることはありませんでした。イン TC39(ECMAScript 標準化団体)のメンバーと緊密に連携し、 V8 チームはいくつかの新機能を提案し、共同で設計し、 より強力にサポートします。

現在、これらの機能を JavaScript 仕様。提案は完全には承認されていなくても、 TC39 プロセスのステージ 3 に到達している必要があります。実装したのは 設計できるようにする必要があります(以下を参照)。 実装のフィードバックをそれぞれの提案作成者に 仕様が確定します。

このブログ投稿では、この刺激的な未来についてご紹介します。目標 試験運用版の JavaScript を有効にする chrome://flags/#enable-javascript-harmony で提供しています。

名前付きキャプチャ

正規表現には、いわゆるキャプチャ(またはグループ)を含めることができ、 捕捉できますここまでで、開発者が参照できるのは インデックスでキャプチャされます。インデックスは、 パターン内でキャプチャします。

const pattern = /(\d{4})-(\d{2})-(\d{2})/u;
const result = pattern.exec('2017-07-10');
// result[0] === '2017-07-10'
// result[1] === '2017'
// result[2] === '07'
// result[3] === '10'

しかし、正規表現は読み書きや変換が難しいことで有名です。 数値参照はさらなる複雑化を招きます。たとえば 長いパターンでは、特定のリソースのインデックスを キャプチャ:

/(?:(.)(.(?<=[^(])(.)))/  // Index of the last capture?

さらに悪いことに、パターンを変更すると、すべての脅威のインデックスが 既存のキャプチャ:

/(a)(b)(c)\3\2\1/     // A few simple numbered backreferences.
/(.)(a)(b)(c)\4\3\2/  // All need to be updated.

名前付きキャプチャは、これらの問題を軽減するために次のような機能を提供する予定です。 デベロッパーがキャプチャに名前を割り当てることができます。構文は Perl に似ており Java、.Net、Ruby:

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-07-10');
// result.groups.year === '2017'
// result.groups.month === '07'
// result.groups.day === '10'

名前付きキャプチャは、名前付き後方参照や String.prototype.replace:

// Named backreferences.
/(?<LowerCaseX>x)y\k<LowerCaseX>/.test('xyx');  // true

// String replacement.
const pattern = /(?<fst>a)(?<snd>b)/;
'ab'.replace(pattern, '$<snd>$<fst>');                              // 'ba'
'ab'.replace(pattern, (m, p1, p2, o, s, {fst, snd}) => fst + snd);  // 'ba'

この新機能の詳細については、仕様案をご覧ください。

dotAll フラグ

デフォルトでは、正規表現の . アトムは、 行終端子の場合:

/foo.bar/u.test('foo\nbar');   // false

プロポーザルでは、/s フラグで有効にする dotAll モードが導入されます。dotAll モードの場合、. は行終端子とも一致します。

/foo.bar/su.test('foo\nbar');  // true

この新機能の詳細については、仕様案をご覧ください。

Unicode プロパティのエスケープ

ES2015 で導入された Unicode 認識により、 数字と見なされる可能性がある文字(丸で囲まれた数字の 1 など): ①;単語として認識される文字。たとえば、「雪」を表す中国語の文字: 雪。

どちらも \d\w と一致しません。意味を変えて 既存の正規表現パターンに悪影響を及ぼします。

代わりに、新しいプロパティのエスケープ シーケンスが 導入です。 なお、使用できるのは Unicode 対応の正規表現で /u フラグによって指定します。

/\p{Number}/u.test('');      // true
/\p{Alphabetic}/u.test('');  // true

その逆は、\P を使用して照合できます。

/\P{Number}/u.test('');      // false
/\P{Alphabetic}/u.test('');  // false

Unicode コンソーシアムでは、数学記号など、さらに多くのプロパティを定義しています。 または日本語のひらがな:

/^\p{Math}+$/u.test('∛∞∉');                            // true
/^\p{Script_Extensions=Hiragana}+$/u.test('ひらがな');  // true

サポートされている Unicode プロパティ クラスの完全なリストについては、 仕様書をご覧ください。 その他の例については、こちらの情報記事をご覧ください。

ルックバック アサーション

先読みアサーションは JavaScript の正規表現構文の一部 考えています対応する後で参照するアサーションが、 導入です。一部のユーザー この機能が 以前から V8 に組み込まれていたことを覚えている方もいるでしょう。さらに、 内部でルックビハインド アサートを使用して、指定された Unicode フラグを実装する リリースされています

この名前はすでにその意味を的確に表しています。これにより、 後方照合グループのパターンが先頭にある場合にのみ一致するパターン。これは、 には、一致するものと一致しないフレーバーがあります。

/(?<=\$)\d+/.exec('$1 is worth about ¥123');  // ['1']
/(?<!\$)\d+/.exec('$1 is worth about ¥123');  // ['123']

詳しくは、以前のブログ投稿をご覧ください。 後で参照するアサーションと、関連する V8 テストケースの例を紹介します。

謝辞

このブログ投稿では、 特に言語チャンピオンの Mathias BynensDan EhrenbergClaude PacheBrian TerlsonThomas Wood、Gorkem Yakin、Irregexp guru Erik Corryアクセス権を持っているすべてのユーザー 言語仕様と V8 の実装に貢献しました。 説明します。

これらの新しい正規表現機能をぜひご活用ください。 あります。