从包括括号的字符串中提取单词

时间:2016-01-15 18:38:07

标签: regex scala

我是Scala的新手。

val str = "Hi My name (is XXX)" 我尝试使用str.split("\\s")拆分并创建字符串数组,如下所示: 0:嗨 1:我的 2:名字 3 :(是 4:XXX)

我想得到 0:嗨 1:我的 2:名字 3 :(是XXX) 在Scala中有没有快速的方法呢

2 个答案:

答案 0 :(得分:1)

您也可以使用以下正则表达式,但它不适用于嵌套的parens。

(\([^)]+\)|\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")

答案 1 :(得分:0)

这将在空格上分开,但始终保持括号之间的内容。

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)