ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 正規表現には単一行モードもあります

JavaScript 正規表現には単一行モードもあります

小云云
小云云オリジナル
2017-12-09 11:27:571076ブラウズ

この記事では主に通常の JavaScript と単一行モードを紹介します。必要な方はぜひ参考にしてください。

正規表現は、1970 年に Ken Thompson によって改良された QED エディターで最初に実装されました。当時の正規表現の最も単純なメタ文字「.」は、改行を除く任意の文字に一致しました:

"." を除く任意の文字に一致しました。 5563c1593a3ac6eb1677af49676ec1ed.

上記の文は、1970 年の QED の公式文書からのもので、これは史上初の正規文書と思われます。

なぜそのようなルールがあるのでしょうか?これは、QED ではファイルを行単位で編集するため、行末の改行文字もこの行の内容に含まれるためです。たとえば、コード内のすべての単一行コメントを削除したい場合は、QED で次のコマンドを使用できます:

1,$s#//.*##

「.」が改行文字と一致する場合、改行文字はこれらの行は次の行とマージされますが、これは通常は望ましくないことです。したがって、「.」は当初、改行と一致しないように設計されていました。現在のオペレーティング システムにはテストできる QED コマンドはありませんが、VIM はまだ存在しており、同じ理由で VIM 内の「.」は改行文字と一致できません。

通常、ファイルの読み取りには一度にファイル全体を読み取る必要がある Node とは異なり、Perl は、次のようにファイルを 1 行ずつ読み取る多くの Linux コマンドの伝統を継承しています。

while (a8093152e673feb7aba1828c43532094) {print $_}

_ 改行文字もありますしたがって、Perl は、「.」は改行文字と一致しないという QED のルールを自然に継承します。しかし、Perl は結局のところ、プログラミング言語であり、エディタではありません。その正規表現が一致させる必要があるオブジェクトは、単一行のテキストだけではなく、複数行のテキストである場合もあります。したがって、その正規表現では、「.」が使用されます。したがって、Perl は、「.」も改行文字と一致できるようにする通常の単一行​​モード /s を発明しました。

Perl で単一行モードを有効にするために使用される /s 修飾子の正式な説明は、「文字列を単一行として扱う」です。この「単一行」は、「.」とのみ一致します。複数行にまたがるモードではなく、通常モードでは、Perl は複数行の文字列を 1 行として扱い、改行文字をインライン文字として扱うため、「.」はそれらに一致します。もっとわかりやすく言うと、次の 3 行のテキスト

1
2
3

を「1n2n3n」の 1 行のテキストとみなします。これが単一行モードの意味です。

しかし、恐ろしいことに、同じ理由で (文字列変数には複数行のテキストを含めることができます)、Perl は複数行モードである /m 修飾子も発明しました。公式の説明では「文字列を複数行として扱う」となっています。このモードの JavaScript の規則は古くから存在します。ここでの「複数行」の意味は、デフォルトでは、文字列の途中にある改行文字の前後の位置と一致しないことです。 、文字列は常に 1 行のみであると見なされ、複数の行が開かれます。パターンは一致します。

つまり、単一行モードと複数行モードは、異なるメタ文字に対応するものであり、正規表現を初めて使用する人は、「単一行モード」と「複数行モード」に混乱するようです。対応しているように見えますが、実際には関係のない名詞によって混同されます。

その後、Ruby の作者は、「単一行モード」という通常の用語が適切に使用されていないと感じたのか、改行文字に一致する「.」のモードを「複数行モード」と呼びました。 * など 正規表現は複数の行に一致するため、修飾子でも /m を使用するのは当然です (Ruby はデフォルトで Perl の「複数行モード」を有効にするため、/m は使用されません)。怪我を侮辱し、さらに混乱を招きます。

その後、Python の作者も「単一行モード」という用語は避けるべきだと感じたので、「dotall」という新しい名前を付けました。これは、ドットがすべての文字に一致するという意味で、非常に良い名前です。以降 Java でもこの名前が使用されます。

上記は歴史を振り返り、シングルラインモードの由来を説明し、シングルラインモードの名前がうまく選ばれなかったことを説明しました。 V8 は最近、ステージ 3 ES プロポーザル https://github.com/mathiasbynens/es-regexp-dotall-flag を実装しました。このプロポーザルでは、JavaScript の規則性に /s 修飾子と dotAll 属性が導入されています。dotAll 属性は Python と Java で学習されます。 /s 修飾子は Perl から継承されています。ここで /d などの新しい修飾子を作成する必要はありません。これにより、事態がさら​​に複雑になるだけです。 JavaScript における /s の具体的な効果は、「.」が、以前は一致しなかった 4 つの行終端文字 (n (改行)、r (キャリッジ リターン)、u2028 (行区切り)、u2029 (段落区切り) と一致できるようにすることです。

/foo/s.dotAll // true
/^.{4}$/s.test("\n\r\u2028\u2029") // true

実際、これは非常に単純なことですが、JavaScript 以外の正規表現に触れたことのない一部の生徒は、この新しいモードを学ぶときに混乱するかもしれません。もう一度明確にしておきます。行モード制御 ^ と $ のパフォーマンス、単一行モードは "." のパフォーマンスを制御しますが、この 2 つの間には直接の関係はありません。

ただし、最初に単一行モードと複数行モードという紛らわしい概念を導入した Perl 言語は、Perl 6 ではこれら 2 つのモードを完全に削除しました: 「.」はデフォルトで改行文字に一致し、N は改行以外のものに一致します。 ^ と $ は常に文字列の先頭と末尾に一致しますが、行の先頭と末尾に一致する 2 つの新しいメタ文字 ^^ と $$ が導入されました。

過去に使用した単一行モード [^] または [sS] の代替手段は、完全に役に立たないわけではありません。たとえば、JavaScript の規則性を使用する一部のエディター (VS Code、Atom) では、使用できない可能性があります。単一行モードのインターフェイスを有効にします。ただし、エディターの通常の機能について言えば、JavaScript で実装されたエディターの通常の機能はまだ弱すぎます。たとえば、Sublime の場合、特定のモードを有効にすることができません。 Python の通常のコード)、通常のコード内で (?s) を使用して dotall モードをオンにします。たとえば、(?s)/*.+?*/ を使用すると、すべての複数行のコメントに一致します。 ,

関連する推奨事項:

検索キーワードのハイライト表示を実装するための JavaScript の正規メソッドの置換_正規表現

JavaScript における正規表現の概念と応用_正規表現

JavaScript 正規表現のアプリケーション

以上がJavaScript 正規表現には単一行モードもありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。