regex - 如何从使用正则表达式测试的字符串中提取参数
问题描述
我正在开发接收文本命令的应用程序:
例如文本命令play film ramboo first blood tv
。
首先,我需要测试命令匹配。然后,我需要从中提取参数:
media = film,
name = ramboo first blood
source = tv
为了匹配检查,我构建了正则表达式。
这是我的命令定义:
sealed trait WordLike {
def parameter: String
}
case class Word(parameter: String, variants: Set[String] = Set.empty) extends WordLike
case class Any(parameter: String) extends WordLike
case class CommandDef(sentence: List[WordLike]) {
private lazy val regexp = {
def acc(r: String, sentence: List[WordLike]): String = {
sentence match {
case x :: xs =>
x match {
case Word(p, variants) => acc(r + "(" + variants.mkString("|") + ")", xs)
case Any(p) => acc(r + ".*", xs)
}
case Nil => r
}
}
acc("^", sentence) + "$"
}
def `match`(text: String): Boolean = text.matches(regexp)
}
上例中的正则表达式:^(play)(film|song).*(tv|pc)$
我像这样使用我的代码:
val cmd = CommandDef(List(
Word("play"),
Word("media", variants = Set("film", "music")),
Any("name"),
Word("source", variants = Set("tv", "pc"))))
cmd.`match`("play film ramboo first blood tv")
我不知道如何从文本中提取参数。
解决方案
捕获组可用于提取参数
val pattern = """^(play) (film|song) (.*) (tv|pc)$""".r("command", "media", "name", "source")
pattern.findFirstMatchIn("play film ramboo first blood tv").foreach { m =>
println(s"media = ${m.group("media")}")
println(s"name = ${m.group("name")}")
println(s"source = ${m.group("source")}")
输出:
media = film
name = ramboo first blood
source = tv
推荐阅读
- mysql - 从源代码编译 MySQL 共享对象
- javascript - jQuery post 使用 express 接收数据
- awk - 如果特定列匹配,则使用 BASH 将它们添加到同一行
- python - 在 Geopandas 的特定距离内过滤和合并两个数据框中的点
- javascript - 在单击引导下拉列表时对数组中的 AZ 和 ZA 进行排序
- unity3d - Unity3D BezierCurve - 跟随 AI 的 Spline Walker?
- c++ - 手动创建二进制文件 C++
- java - IDEA 编译器错误 Unknown version '8', no version setting will be given to the compiler
- python-3.x - 尝试使用 Homebrew 更新 Python 3
- python - 为 Keras 预处理数据