(所有示例都可以通过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
答案 0 :(得分:0)
因为matches
尝试匹配整个字符串。 "(?m)^foo$"
正则表达式与输入字符串foo
中的换行符和以下foo\nfoo
字符串不匹配。
以下代码将返回True
,因为使用的正则表达式将匹配整个字符串。
"(?s)^foo.*$".r.pattern.matcher("foo\nfoo").matches()