2017-08-11 65 views
1

我想用正则表达式"(.*)\r\n(.*)".rabcd\r\nabc\r\nppp划分为(abcd\r\nabc, ppp)Scala正则表达式不能匹配包含多个“ r n”的给定字符串中的“ r n”

但正则表达式匹配失败,因为这样的:

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 - ") 
    } 
} 

控制台打印fail -

如果使用正则表达式匹配abcd\r\nppp,代码再次,它工作正常:

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至其他characters.It的浪费计算资源,因为所使用的代码到性能敏感的阶段。

感谢

回答

1

点不匹配\n默认情况下(不要问为什么 - 没有理由,只是没有),所以.*未能在第二\n。 您可以通过为您的正则表达式指定DOTALL标志来更改该标志。这是通过增加(?s)到模式的开始时进行(不要问如何?s来代表DOTALL ......有很多的奥秘像这样的正则表达式的世界):

val r = "(?s)(.*)\r\n(.*)".r 
val str = "abcd\r\nabc\r\nppp" 
str match { 
    case r(a,b) => println(a -> b) 
} 

这将打印 ( ABCD ABC, PPP )

如果你想在第一\r\n分裂,而不是最后一个加?到第一组:

val r = "(?s)(.*?)\r\n(.*)".r 

这使通配符非贪婪,以便匹配尽可能短的字符串,而不是最长的,这是默认值。

+0

你真的好:) –

相关问题