Clojure多线正则表达式

时间:2013-02-22 09:22:39

标签: regex clojure

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

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

失败:

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

使用:

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

我做错了什么?

2 个答案:

答案 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)开关被欺骗性地命名 - 它会更改^$锚点的作用,允许它们也匹配行尾和行尾,分别 - 这不是你想要的。