この記事では主に JavaScript の正規表現を紹介します。これには単一行モードもあります。必要な方は参照してください。
正規表現は、1970 年に Ken Thompson によって改良された QED Editor に初めて実装されました。正規表現の最も単純なメタ文字「.」は、その時点で改行文字を除く任意の文字に一致しました:
「.」は、
上記の文は QED の公式から来ています1970 年の文書であり、これは歴史上最初の正規の文書である可能性があります。
なぜそのようなルールがあるのでしょうか?これは、QED ではファイルを行単位で編集するため、行末の改行文字もこの行の内容に含まれるためです。たとえば、コード内の単一行コメントをすべて削除したい場合は、QED で次のコマンドを使用できます:
1,$s#//.*##
「.」が改行文字と一致する場合、改行文字も削除されます。これにより、これらの行が発生し、次の行がマージされますが、これは通常、私たちが望むものではないため、「.」が最初に発明されたときは、改行と一致しないように設計されていました。現在のオペレーティング システムにはテストできる QED コマンドはありませんが、VIM はまだ存在しており、同じ理由で VIM 内の「.」は改行文字と一致できません。
Node とは異なり、ファイルの読み取りは通常、次のようにファイルを 1 行ずつ読み取る多くの Linux コマンドの伝統を継承しています。
while (<>) {print $_}</p> <p>_ の最後には改行文字もあります。したがって、Perl 「.」は改行文字と一致しないという QED のルールを継承するのも自然です。しかし、Perl は結局のところ、エディターではなく、<a href="http://www.php.cn/wiki/43.html" target="_blank">プログラミング言語</a>です。その正規表現が一致する必要があるオブジェクトは、単一行のテキストだけではなく、複数行のテキストである場合もあります。したがって、その正規表現では、" ." には行間一致があります。そのため、Perl は、"." も改行文字と一致できるようにする通常の単一行モード /s を発明しました。 </p> <p>Perl で単一行モードを有効にするために使用される /s 修飾子の正式な説明は、「文字列を単一行として扱う」です。この「単一行」は、「.」とのみ一致します。複数行にまたがるモードではなく、通常モードでは、Perl は複数行の文字列を 1 行として扱い、改行文字をインライン文字として扱うため、「.」はそれらに一致します。もっと分かりやすく言うと、次の 3 行のテキスト </p> <pre class="brush:php;toolbar:false">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 属性が導入されています。 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 単一行 mode_正規表現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。