17

文字列の基本的なhtmlパターンをテストしようとしていますが、m(マルチライン)修飾子を使用していますが、文字列が1ライナーの場合にのみ機能します。

(re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c))

失敗:

"<html>   <body>   sad   </body> 
     </html>"

作品:

"<html>   <body>   sad   </body>      </html>"

私は何が間違っているのですか?

4

2 に答える 2

21

免責事項:私はClojureプログラマーではありませんが、この問題は言語に依存しないと思います。

複数行モードが有効になっている場合、カレット^とドルの解釈は次のように変化します。入力文字列全体$の最初と最後を照合する代わりに、入力文字列の各行の最初と最後を照合します。これは-私が見る限り-あなたが望む/必要なものではありません。

必要な.*のは、改行と一致することです(デフォルトでは改行されません)。これは、単一行モード(別名ドットオールモード)を有効にすることで実行できます。つまり、これは次のことを意味します。

(re-find #"(?is)^<html>.*<body>.*</body>.*</html>" c))

これは、 RegExrで確認することもできます。

于 2013-02-22T09:46:18.033 に答える
15

(?s)「ドットオールモード」スイッチを使用する必要があります。

例:

user=> (re-find #"\d{3}.\d{3}" "123\n456")    
nil

user=> (re-find #"(?s)\d{3}.\d{3}" "123\n456")
"123\n456"

(?m)スイッチには一見名前が付けられています。アンカー^とアンカーの動作が変更さ$れ、それぞれ行の先頭と行の終わりに一致するようになります。これは望ましくありません。

于 2013-02-22T13:18:50.643 に答える