我正在尝试测试基本html模式的字符串,虽然我使用m(多行)修饰符,但只有在字符串为1-liner
时才有效(re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c))
失败:
"<html> <body> sad </body>
</html>"
使用:
"<html> <body> sad </body> </html>"
我做错了什么?
答案 0 :(得分:17)
免责声明:我不是Clojure程序员,但我认为这个问题与语言无关。
启用多行模式时,插入符^
和美元$
的解释会发生如下变化:而不是匹配整个输入字符串的开头和结尾 ,它们匹配输入字符串中每行的开头和结尾。这是 - 据我所知 - 不是你想要/需要的。
你想要的是你的.*
匹配换行符(默认情况下它们没有做什么),这可以通过启用单行模式(也就是全点模式)来完成。所以这意味着:
(re-find #"(?is)^<html>.*<body>.*</body>.*</html>" c))
您还可以在RegExr上验证这一点。
答案 1 :(得分:12)
您需要使用(?s)
“dotall模式”switch。
示例:
user=> (re-find #"\d{3}.\d{3}" "123\n456")
nil
user=> (re-find #"(?s)\d{3}.\d{3}" "123\n456")
"123\n456"
(?m)
开关被欺骗性地命名 - 它会更改^
和$
锚点的作用,允许它们也匹配行尾和行尾,分别 - 这不是你想要的。