Regex Scala正则表达式可以';“t匹配”\r\n“;在包含多个“的给定字符串中”\r\n“;
我希望使用正则表达式(.*)将Regex Scala正则表达式可以';“t匹配”\r\n“;在包含多个“的给定字符串中”\r\n“;,regex,scala,Regex,Scala,我希望使用正则表达式(.*)将abcd\r\nabc\r\nppp拆分为(abcd\r\nabc,ppp)。r 但正则表达式匹配失败,原因如下: object Regex extends App { val r = "(.*)\r\n(.*)".r val str = "abcd\r\nabc\r\nppp" str match { case r(a,b) => println((a,b)) case _ => println("
abcd\r\nabc\r\nppp
拆分为(abcd\r\nabc,ppp)
。r
但正则表达式匹配失败,原因如下:
object Regex extends App {
val r = "(.*)\r\n(.*)".r
val str = "abcd\r\nabc\r\nppp"
str match {
case r(a,b) =>
println((a,b))
case _ =>
println("fail - ")
}
}
控制台打印失败-
如果使用正则表达式匹配,则可以正常工作,再次编码:
object Regex extends App {
val r = "(.*)\r\n(.*)".r
val str = "abcd\r\nppp"
str match {
case r(a,b) =>
println((a,b))
case _ =>
println("fail - ")
}
}
此外,我不想替换其他字符。\r\n这会浪费计算资源,因为代码用于性能敏感阶段
谢谢默认情况下,点与
\n
不匹配(不要问为什么-没有原因,它就是不匹配),因此*
在第二次\n
时失败。
您可以通过在正则表达式中指定DOTALL
标志来改变这一点。这是通过在模式的开头添加(?s)
(不要问?s
是如何代表DOTALL的……在regex世界中有很多类似的神秘事物):
这张照片
(abcd)
美国广播公司,
购买力平价
)
如果要在第一个\r\n
而不是最后一个拆分,请将?
添加到第一个组:
val r = "(?s)(.*?)\r\n(.*)".r
这使得通配符不贪婪,因此它将匹配尽可能短的字符串,而不是默认的最长字符串。您真的很好:)
val r = "(?s)(.*?)\r\n(.*)".r