Clojure多线正则表达式

R X*_*R X 15 regex clojure

我正在尝试测试一个字符串的基本html模式,虽然我使用m(多线)修饰符,它只适用于字符串是1-liner

(re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c))
Run Code Online (Sandbox Code Playgroud)

失败:

"<html>   <body>   sad   </body> 
     </html>"
Run Code Online (Sandbox Code Playgroud)

作品:

"<html>   <body>   sad   </body>      </html>"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

zb2*_*226 18

免责声明:我不是Clojure程序员,但我认为这个问题与语言无关.

当启用多行模式时,插入符号^和美元的解释会$改变如下:它们不是匹配整个输入字符串的开头和结尾,而是匹配输入字符串中每行的开头和结尾.这是 - 据我所知 - 不是你想要/需要的.

你想要的是你的.*s匹配换行符(默认情况下它们没有做什么),这可以通过启用单行模式来完成.所以这意味着:

(re-find #"(?is)^<html>.*<body>.*</body>.*</html>" c))
Run Code Online (Sandbox Code Playgroud)

您也可以在RegExr上验证这一点.


Mat*_*ick 13

您需要使用(?s)"dotall模式" 开关.

例:

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

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

这个(?m)开关被看似命名 - 它改变了^$锚点的作用,允许它们分别匹配行尾和行尾 - 这不是你想要的.