Scala多行正则表达式/正则表达式(?m)不起作用

时间:2015-04-13 15:41:56

标签: regex scala pattern-matching multiline

(所有示例都可以通过scala repl或sbt控制台运行)

我有这个多行字符串:

val a= "A0DA000043\n"+
"A020000008933F57845F706921\n"+
"A0A0000000 (9000)\n"+
"A0A40000027FDE (9FXX,9000) \n"+
"84E400000BD2012F261C86BC6C3C679F (6101,9000)\n"+
"00A4040008A000000151000000 (61XX,9000)"

然后我有这个正则表达式:

(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$

我这样用:

scala> """(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$""".r.pattern.matcher(a).matches()
res10: Boolean = false

但如果这样做:

scala> ("""(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$""".r findAllIn a).toList
res8: List[String] = List(A0DA000043, A020000008933F57845F706921, A0A0000000 (9000), "A0A40000027FDE (9FXX,9000) ", 84E400000BD2012F261C86BC6C3C679F (6101,9000), 00A4040008A000000151000000 (61XX,9000))

它返回所有行。但我想知道为什么.matches()不起作用。

如果我在.matches中尝试一行

scala> """(?m)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *$""".r.pattern.matcher("A0A40000027FDE (9FXX,9000)").matches()
res9: Boolean = true

现在即使是最简单的多行正则表达式也无效

"(?m)^foo$".r.pattern.matcher("foo\nfoo").matches()
res38: Boolean = false

有什么不对?任何人都可以举例说明如何使用(?m)甚至尝试匹配val a。

我想知道val是否与我的正则表达式匹配。

先谢谢

编辑:我尝试了下面的一些答案,例如使用(?s)和。*作为换行符。它适用于示例1,但它将无效数据视为有效。例如:

scala> val c = "A0A0000000 (9000"
c: String = A0A0000000 (9000

scala> """(?s)^ *(?:[0-9A-F]{2})+(?: +\([0-9A-FX,]+\))? *.*$""".r.pattern.matcher(c).matches()
res45: Boolean = true

1 个答案:

答案 0 :(得分:0)

因为matches尝试匹配整个字符串。 "(?m)^foo$"正则表达式与输入字符串foo中的换行符和以下foo\nfoo字符串不匹配。

以下代码将返回True,因为使用的正则表达式将匹配整个字符串。

"(?s)^foo.*$".r.pattern.matcher("foo\nfoo").matches()