【问题标题】:Multiline regex capture in ScalaScala 中的多行正则表达式捕获
【发布时间】:2013-06-12 06:20:14
【问题描述】:

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

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

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

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

返回空。

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

如果我删除换行符,正则表达式会起作用。

我还找到了this,但无法正常工作。

如何匹配&lt;p&gt; 元素之间的内容?我想要介于两者之间的所有内容,以及换行符。

提前致谢!

【问题讨论】:

标签: regex scala


【解决方案1】:

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

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

(?m) 表示^ 和$ 表示行首和行尾

【讨论】:

  • 是的...(?m) 将改变^ 和$ 的行为。令人困惑的名字;)
  • @fge 令人困惑,但 m = 多行,s = 单行。
  • 我花了一点时间才意识到,并且对我的应用程序来说是必需的:m 和 s 不是相互排斥的。你可以拥有 (?ms),它会像你期望的那样工作。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2011-03-03
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多