我正在尝试测试一个字符串的基本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)
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)开关被看似命名 - 它改变了^和$锚点的作用,允许它们分别匹配行尾和行尾 - 这不是你想要的.