Я долго работал с Regex replaceAllIn
, но столкнулся с проблемой, когда в строке replacement
было что-то похожее на регулярное выражение. Следующее иллюстрирует проблему (Scala 2.9.1-1). Обратите внимание, что реальное пространство проблем гораздо сложнее, поэтому идея использования более простого решения на самом деле недопустима (просто чтобы исключить неизбежное «Почему бы вам не попробовать ...»: D)
val data = "val re = \"\"\"^[^/]*://[^/]*/[^/]*$\"\"\".r"
val source = """here
LATEX_THING{abc}
there"""
val re = "LATEX_THING\\{abc\\}".r
println(re.replaceAllIn(source, data))
Это приводит к следующей ошибке:
java.lang.IllegalArgumentException: Illegal group reference
Если я изменю data
с того, что было, на что-то простое:
val data = "This will work"
Тогда все хорошо.
Похоже, replaceAllIn
каким-то образом просматривает вторую строку и использует ее в качестве другого RE для ссылки на то, что запомнилось из первого RE ... но документы ничего не говорят об этом.
Чего мне не хватает?
edit : Хорошо, поэтому, посмотрев на класс java.util.regex.Matcher
, может показаться, что предполагаемое исправление:
re.replaceAllIn(source, java.util.regex.Matcher.quoteReplacement(data))