12

我正在尝试从多行正则表达式中捕获内容。它不匹配。

val text = """<p>line1 
    line2</p>"""

val regex = """(?m)<p>(.*?)</p>""".r

var result = regex.findFirstIn(text).getOrElse("")

返回空。

我将 m - 标志用于多行,但在这种情况下似乎没有帮助。

如果我删除换行符,则正则表达式有效。

我也发现了这个,但无法让它工作。

如何匹配元素之间的<p>内容?我想要介于两者之间的一切,也想要换行符。

提前致谢!

4

2 回答 2

25

如果要在 scala 中激活 dotall 模式,必须使用(?s)而不是(?m)

(?s)表示点可以匹配换行符

(?m)表示^$代表行的开始和结束

于 2013-06-15T21:45:48.237 回答
6

如果此时不明显,“我如何匹配内容”:

scala> val regex = """(?s)<p>(.*?)</p>""".r

scala> (regex findFirstMatchIn text).get group 1
res52: String = 
line1 
    line2

更通俗的说,

scala> text match { case regex(content) => content }
res0: String =
line1
    line2

scala> val embedded = s"stuff${text}morestuff"
embedded: String =
stuff<p>line1
    line2</p>morestuff

scala> val regex = """(?s)<p>(.*?)</p>""".r.unanchored
regex: scala.util.matching.UnanchoredRegex = (?s)<p>(.*?)</p>

scala> embedded match { case regex(content) => content }
res1: String =
line1
    line2
于 2013-06-16T01:03:02.033 回答