Regex Clojure多行正则表达式
我试图测试一个字符串的基本html模式,尽管我使用了m(多行)修饰符,但它只在字符串为1行时起作用Regex Clojure多行正则表达式,regex,clojure,Regex,Clojure,我试图测试一个字符串的基本html模式,尽管我使用了m(多行)修饰符,但它只在字符串为1行时起作用 (re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c)) (重新查找#“(?im^.*.c)) 失败: "<html> <body> sad </body> </html>" 悲伤的 " 作品: "<html>
(re-find #"(?im)^<html>.*<body>.*</body>.*</html>" c))
(重新查找#“(?im^.*.c))
失败:
"<html> <body> sad </body>
</html>"
悲伤的
"
作品:
"<html> <body> sad </body> </html>"
“悲伤”
我做错了什么?免责声明:我不是Clojure程序员,但我认为这个问题与语言无关 启用多行模式时,插入符号
^
和美元$
的解释如下所示:它们不匹配整个输入字符串的开头和结尾,而是匹配输入字符串中每行的开头和结尾。就我所知,这不是你想要/需要的
您需要的是让您的*
s匹配换行符(默认情况下它们不会这样做),这可以通过启用单行模式(也称为点全部模式)来实现。这意味着:
(re-find #"(?is)^<html>.*<body>.*</body>.*</html>" c))
(重新查找#“(?is^.*.*.“c))
您还可以在上进行验证。您需要使用(?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)
开关的名称有欺骗性--它改变了^
和$
锚的功能,允许它们分别匹配行的开始和结束--这不是您想要的。我就把它留在这里,谢谢Matt!其他人可能也会觉得有用。