我有一个类似的字符串
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
诊断是一样的;有不同的方法可以把绳子拉开。