Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Scala正则表达式可以';“t匹配”\r\n“;在包含多个“的给定字符串中”\r\n“;_Regex_Scala - Fatal编程技术网

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