ホームページ  >  記事  >  ウェブフロントエンド  >  単線モードとは何ですか? JavaScript 通常の単一行​​モードの詳細な説明

単線モードとは何ですか? JavaScript 通常の単一行​​モードの詳細な説明

零下一度
零下一度オリジナル
2017-04-21 10:20:351384ブラウズ

この記事では、単一行モードも備えた JavaScript 正規表現を主に紹介します。必要な方は参照してください。

正規表現は、1970 年に Ken Thompson によって改良された QED エディターで最初に実装されました。正規表現は最も単純です。 " は、5563c1593a3ac6eb1677af49676ec1ed を除く任意の文字に一致する正規表現です。

上記の文は、1970 年の QED の公式文書からのもので、これは史上初の正規文書である可能性があります。

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

1,$s#//.*##

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

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

while (a8093152e673feb7aba1828c43532094) {print $_}

_ の最後には改行文字もあります。また、「.」は改行文字と一致しないという 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 プロポーザル github.com/mathiasbynens/es-regexp-dotall-flag を実装しました。このプロポーザルでは、JavaScript の規則性に対して /s 修飾子と dotAll 属性が導入されています。dotAll 属性は、Python と Java から学んだものです。修飾子は 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 通常の単一行​​モードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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