【发布时间】:2016-04-21 10:23:44
【问题描述】:
我是 Scala 新手。
val str = "Hi My name (is XXX)"
我尝试使用str.split("\\s") 进行拆分,并创建如下字符串数组:
0:嗨
1:我的
2:名称
3:(是
4:XXX)
我想得到 0:嗨 1:我的 2:名称 3:(是XXX) 在 Scala 中是否有任何快速的方法来做到这一点
【问题讨论】:
我是 Scala 新手。
val str = "Hi My name (is XXX)"
我尝试使用str.split("\\s") 进行拆分,并创建如下字符串数组:
0:嗨
1:我的
2:名称
3:(是
4:XXX)
我想得到 0:嗨 1:我的 2:名称 3:(是XXX) 在 Scala 中是否有任何快速的方法来做到这一点
【问题讨论】:
您也可以使用以下正则表达式,尽管它不适用于嵌套括号。
(\([^)]+\)|\S+)
在控制台中测试:
@ """(\([^)]+\)|\S+)""".r.findAllIn("Hi My name (is XXX)").toList
res8: List[String] = List("Hi", "My", "name", "(is XXX)")
@ """(\([^)]+\)|\S+)""".r.findAllIn("(A B) C D (E F G) H").toList
res9: List[String] = List("(A B)", "C", "D", "(E F G)", "H")
@ """(\([^)]+\)|\S+)""".r.findAllIn("Z (A B) C D (E F G) H").toList
res10: List[String] = List("Z", "(A B)", "C", "D", "(E F G)", "H")
【讨论】:
这将在空格处拆分,但始终保持括号之间的内容完整。
def splitWithParens(s: String) =
s.split("[()]").grouped(2).flatMap {
case Array(a,b) => a.split("\\s+").filter(_.nonEmpty) :+ s"($b)"
case Array(a) => a.split("\\s+").filter(_.nonEmpty)
}.toVector
splitWithParens("Hi My name (is XXX)") // Vector(Hi, My, name, (is XXX))
splitWithParens("(A B) C D (E F G) H") // Vector((A B), C, D, (E F G), H)
splitWithParens("Z (A B) C D (E F G) H") // Vector(Z, (A B), C, D, (E F G), H)
【讨论】: