Scala Replacement by Regex



我有一个类似的字符串

val bar = "M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo".

现在我拆分这个字符串并定义模式

val split = bar.split("-")
val pattern = ".*(A|K)\d.*".r

现在我想在"拆分"的最后一个条目中替换A9K9foo

val last = split.last
val suffix = last match {
  case pattern(_) => last replaceFirst ("""(Ad)?(Kd)?.*""", "")
  case _          => last
}

我所知道的是replaceFirst被执行了,但它不会取代我"最后"val中的A9K9foo(replaceFirst只应在"last"与"pattern"匹配时执行),所需结果为M2。

编辑:可能最后一个不是M9A9K9foo,而是M9A9或M9K9foo或可能是M9A9K9。我只想替换除了A\d或K\d之前的文本之外的所有内容,但如果没有A\d和K\d,就不会发生任何事情。

你知道为什么这个替代品不起作用吗?

您使用的是String.replaceFirst,您的模式有一个通配符,它会消耗所有内容。

也许你想要:

last replaceFirst ("""AdKd""", "")

其中A9K9不是可选的,这就是您想要更换的全部。

还有其他配方:

scala> val r = """(AdKd)""".r
r: scala.util.matching.UnanchoredRegex = (AdKd)
scala> val m = (r findAllMatchIn bar).toList.last
m: scala.util.matching.Regex.Match = A9K9
scala> s"${m.before}${m.after}"
res15: String = M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9foo

这不是最聪明的。

更多:

scala> val r = """(A|K)d""".r
r: scala.util.matching.Regex = (A|K)d
scala> val bar = "M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo"
bar: String = M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo-M9A9K9foo
scala> val last = (bar split "-").last
last: String = M9A9K9foo
scala> r findFirstMatchIn last map (_.before) getOrElse last
res0: CharSequence = M9
scala> val r = """(.*?)((A|K)d.*)?""".r
r: scala.util.matching.Regex = (.*?)((A|K)d.*)?
scala> last match { case r(prefix, _*) => prefix }
res1: String = M9
scala> "M9" match { case r(prefix, _*) => prefix }
res2: String = M9
scala> "M9K9foo" match { case r(prefix, _*) => prefix }
res3: String = M9
scala> val r = """(.*?)(?:(?:A|K)d.*)?""".r
r: scala.util.matching.Regex = (.*?)(?:(?:A|K)d.*)?
scala> last match { case r(prefix) => prefix }
res4: String = M9

诊断是一样的;有不同的方法可以把绳子拉开。

最新更新