目前我正在使用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)
我应该使用什么样的正则表达式?
你的正则表达式并不遥远:
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)
我更喜欢解析器组合版本,个人 - 它实际上是自我记录的,并且更容易扩展和维护.
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |