在分割时捕获以"[["并以"]]"开头的所有字符串作为正则表达式

Ken*_*ong 2 java regex scala

目前我正在使用str.toLowerCase.split("[\\s\\W]+")摆脱空格和标点符号,但有一类特殊的字符串我想保留为一个并排除在此处理之外:

[[...multiple words...]]
Run Code Online (Sandbox Code Playgroud)

例:

[[Genghis Khan]] 
Run Code Online (Sandbox Code Playgroud)

应保持为

[[Genghis Khan]]
Run Code Online (Sandbox Code Playgroud)

我应该使用什么样的正则表达式?

Tra*_*own 8

你的正则表达式并不遥远:

def tokenize(s: String) = """\w+|(\[\[[^\]]+\]\])""".r.findAllIn(s).toList
Run Code Online (Sandbox Code Playgroud)

然后:

scala> tokenize("[[Genghis Khan]] founded the [[Mongol Empire]].")
res1: List[String] = List([[Genghis Khan]], founded, the, [[Mongol Empire]])
Run Code Online (Sandbox Code Playgroud)

不过,对于Scala的解析器组合器来说,这是一个很好的用例:

import scala.util.parsing.combinator._

object Tokenizer extends RegexParsers {
  val punc = "[,;:\\.]*".r
  val word = "\\w+".r
  val multiWordToken = "[[" ~> "[^\\]]+".r <~ "]]"
  val token = (word | multiWordToken) <~ punc
  def apply(s: String) = parseAll(token+, s)
}
Run Code Online (Sandbox Code Playgroud)

这同样给了我们:

scala> Tokenizer("[[Genghis Khan]] founded the [[Mongol Empire]].").get
res2: List[String] = List(Genghis Khan, founded, the, Mongol Empire)
Run Code Online (Sandbox Code Playgroud)

我更喜欢解析器组合版本,个人 - 它实际上是自我记录的,并且更容易扩展和维护.