如何用scala组合器匹配句子中的所有单词?
问题描述:
对于斯卡拉组合子第一个测试,我想从一个句子让所有的话,但我只是让“无”,从下面的代码:如何用scala组合器匹配句子中的所有单词?
import java.io.File
import scala.io.Source
import scala.util.parsing.combinator._
object PgnReader extends TagParser {
def parseFile(inputFile:File) = {
val pgnStream = Source.fromFile(inputFile)
val pgnStr = pgnStream.mkString
println(parseAll(tag, "Hello World !").getOrElse("None"))
pgnStream.close
}
}
trait TagParser extends RegexParsers {
val tag:Parser[String] = """[:alpha:]+""".r ^^ (_.toString)
}
我希望得到的东西,如:
Hello
World
甚至像:
List(Hello, World)
我是在我的代码的正确方法?
我使用Scala的2.11和scala combinators
答
我认为这可能让你更接近:
trait TagParser extends RegexParsers {
val tag = rep("""\p{Alpha}+""".r) ^^ (_.map(_.toString))
}
POSIX字符类在斯卡拉(as inherited from Java)不同的语法。 rep()
语法允许多次出现(给出List()
)。
这将仍然扼杀感叹号,所以你可以扩大你的正则表达式。我大概也有“标签”和“标签”分开的概念去让事情更清晰:
trait TagParser extends RegexParsers {
val tags = rep(tag)
val tag = """\p{Alpha}+|!""".r ^^ (_.toString)
}
...
println(parseAll(tags, "Hello World !").getOrElse(None))
...
答
你应该使用类似的东西相匹配的令牌序列,而不是一个令牌:
trait TagParser extends RegexParsers {
val tags: Parser[List[String]] = rep("""[a-zA-Z]+""".r)
}
rep
是:
解析器发生器重复。 rep(p)重复使用p来解析输入,直到p失败(结果 是p的连续结果的列表)。
对不起,但我仍然得到“没有” – loloof64 2014-11-24 16:09:28
也许是因为“!”与[:alpha:]不匹配? – dk14 2014-11-24 16:11:20
不,即使没有额外的字符也不会得到任何结果 – loloof64 2014-11-24 16:15:40