2013-02-22 24 views
12

我想测试一个字符串一个基本的HTML模式,虽然我用的是m(多)修改它只能当字符串是1班轮Clojure的多正则表达式

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

失败:

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

作品:

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

我在做什么错?

+1

我只是把它留在这里http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – mobyte 2013-02-22 10:06:06

回答

14

声明:我不是Clojure程序员,但我认为这个问题是独立于语言的。

启用多行模式,光标^的解释和美元$的变化是这样的:相反,开始和整个输入字符串结束匹配的,它们匹配的开始和结束输入字符串中的每一行。这是 - 据我所知 - 不是你想要/需要的。

你想要的是你的.*s匹配换行符(他们不默认),这可以通过启用单行模式来完成。所以这意味着:

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

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

10

您需要使用(?s)“dotall mode”switch

例子:

user=> (re-find #"\d{3}.\d{3}" "123\n456")  
nil 

user=> (re-find #"(?s)\d{3}.\d{3}" "123\n456") 
"123\n456" 

(?m)开关欺骗性命名 - 它改变了什么^$锚做,让他们也分别启动的行和结束行,匹配 - - 这不是你想要的。

+0

谢谢马特!其他人可能会发现http://nakkaya.com/2009/10/25/regular-expressions-in-clojure/也很有用。 – 2013-11-28 21:19:49