Scala中的多行正则表达式捕获

Ixx*_*Ixx 11 regex scala

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

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

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

var result = regex.findFirstIn(text).getOrElse("")
Run Code Online (Sandbox Code Playgroud)

返回空.

我把m - 标志放在多线上,但在这种情况下似乎没有帮助.

如果我删除换行符正则表达式工作.

我也发现了这个,但无法让它发挥作用.

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

提前致谢!

Cas*_*yte 25

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

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

(?m)意味着^$代表起点和终点


som*_*ytt 5

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

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

scala> (regex findFirstMatchIn text).get group 1
res52: String = 
line1 
    line2
Run Code Online (Sandbox Code Playgroud)

更具有惯用力,

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
Run Code Online (Sandbox Code Playgroud)