当一行与Scala中的子字符串匹配时,拆分多行字符串

时间:2017-07-19 15:42:41

标签: regex scala

当一行与Scala中的子字符串匹配时,拆分多行字符串。以下是相同的代码段。但我想使用正确的正则表达式。

val s1 =
  """
    |Hello;
    |------------------------------
    |GO
    |World
    |go
    |True
    |            GO
    |,I am Naga
    |+++++++++++++++++++++++++
    |GOTO School
    |GO Heaven
  """
s1.split("\n(?i)GO\n")

输出:

Hello;
------------------------------
World
True
,I am Naga
+++++++++++++++++++++++++
GOTO School 
GO Heaven

想要在正则表达式中使用^和$而不是\ n

进行检查

2 个答案:

答案 0 :(得分:1)

您可以使用

val key = "GO"
val res = s1.stripMargin('|').split(s"(?mi)^\\s*${key}\\s*$$[\r\n]*")

请参阅Scala demo

在使用stripMargin('|')首先删除缩进后应用正则表达式拆分。

模式匹配

  • (?mi) - 整个模式不区分大小写,因为i是不区分大小写的修饰符,m使^$匹配开始/结束而不是字符串
  • ^ - 行的开头
  • \\s* - 0个或更多空格
  • ${key} - key的值(请注意该变量中的might need Pattern.quote to escape any special chars
  • \\s* - 尾随行空白
  • $$ - 它实际上是单个文字$ - 一行的结尾(由于字符串文字是插值的,其中$用于引入代码,因此它加倍)
  • [\r\n]* - 零个或多个CR或/和LF换行符。

答案 1 :(得分:0)

s1.split( "(?m)^(\\s*(?i)%s)\\s*$[\r\n]*".format("GO"))

最后的答案。