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