これは表現で何を意味しますか?
(?m:.*?)
またはこれ
(?m:\s*)
つまり、空白と関係があるように見えますが、よくわかりません。
追加
の詳細:私が見ている完全な表現は次のとおりです。
\A((?m:\s*)((\/\*(?m:.*?)\*\/)|(\#\#\# (?m:.*?)\#\#\#)|(\/\/ .* \n?)+|(\# .* \n?)+))+
(?...)
括弧内の正規表現に修飾子を適用する方法です。
(?:...)
一致エンジンによってキャプチャされた文字列のセットに影響を与えることなく、括弧の間の部分をグループとして扱うことができます。?
ただし、と の間にオプション文字を追加することはできます:
。その場合、括弧の間の正規表現の部分は、正規表現の作成時にそれらのオプション文字を含めたかのように動作します。つまり/(?m:...)/
、 と同じように動作し/.../m
ます。
はm
、「複数行」モードを有効にします。
訂正:
このオプションは環境によって意味が異なるため、元の回答で混乱したのはここです。
この質問は Ruby にタグ付けされています。「複数行モード」では、ドット文字 ( .
) が改行に一致しますが、通常は一致しない 1 文字です。
irb(main):001:0> "a\nb" =~ /a.b/
=> nil
irb(main):002:0> "a\nb" =~ /a.b/m
=> 0
irb(main):003:0> "a\nb" =~ /(?m:a.b)/
=> 0
したがって、最初の正規表現は、(?m:.*?)
任意の数 (0 を含む) の任意の文字 (改行を含む) と一致します。基本的に、何にでもマッチします。
2 番目の正規表現 では(?m:\s*)
、含まれる式に変更するドットがないため、修飾子はまったく効果がありません。
最初の表現に戻ります。オメガが言うように、?
後の*
は貪欲でないマッチであることを意味します。それが表情全体だったり、キャプチャがなかったりしても問題ありません。しかし、そのセクションに何かが続き、キャプチャーがあると、異なる結果が得られます。がなければ、?
可能な限り長いマッチが勝ちます:
irb(main):001:0> /<(.*)>/.match("<a><b>")[1]
=> "a><b"
を使用する?
と、代わりに最短のものを取得できます。
irb(main):002:0> /<(.*?)>/.match("<a><b>")[1]
=> "a"
最後に、上記の/m
混乱について (混乱を避けたい場合は、ここで読むのをやめてください):
Perl 5 (基本的な構文を超えたほとんどの正規表現拡張のソース) では、/m
Ruby でトリガーされる動作は代わりに/s
オプションによってトリガーされます (Ruby にはありませんが、正規表現にオプションを追加すると、暗黙的に実行されます)。それを無視します)。Perl では/m
、 は依然として「複数行モード」と呼ばれていますが、まったく異なる効果があります。文字列内の改行だけでなく、文字列全体の先頭と末尾でも、^
とアンカーがそれぞれ一致します。$
しかし、Ruby では、その動作がデフォルトであり、それを変更するオプションさえありません。
パターン.*?
は任意の文字列に一致しますが、遅延演算子があるため、できるだけ短い文字列に一致します?
。
パターン\s*
は空白文字 (ゼロ以上) に一致します。
(?m)
「複数行モード」を有効にします。このモードでは、サブジェクト文字列の改行の前後でキャレットとドルが一致します。このモードを一部のサブパターンのみに適用するには、sytax(?m:...)
を使用します。ここ...
で、 は一致するパターンです。
詳細については、http://www.regular-expressions.info/modifiers.htmlを参照してください。