17

我正在尝试测试基本 html 模式的字符串,虽然我使用 m(多行)修饰符,但它仅在字符串是 1-liner 时才有效

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

失败:

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

作品:

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

我究竟做错了什么?

4

2 回答 2

21

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

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

您想要的是让您.*的 s 匹配换行符(默认情况下它们不执行的操作),这可以通过启用单行模式(也称为 dot-all 模式)来完成。所以这意味着:

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

您还可以在RegExr上验证这一点。

于 2013-02-22T09:46:18.033 回答
15

您需要使用(?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)开关具有欺骗性的名称——它改变了^$锚点的作用,允许它们分别匹配行首和行尾——这不是你想要的。

于 2013-02-22T13:18:50.643 回答