Может быть, не совсем то, что вы ищете, но, возможно, это так.Что, если вы сначала обеспечите (отфильтруете) интересующие линии и просто замените то, что нужно заменить, например, используйте следующую функцию преобразования:
val matcherForIds = Regex("(.*)\\.messageid=(X|Y)\\d{4,6}E")
val idRegex = Regex("[XY]\\d{4,6}E")
var idCounter = 5
fun transformIds(line: String) = idRegex.replace(line) {
"Z%05dE".format(idCounter++)
}
со следующим фильтром:
"a.messageid=X0001E\nb.messageid=Y0001E"
.lineSequence()
.filter(matcherForIds::matches)
.map(::transformIds)
.forEach(::println)
В случае, если есть и другие релевантные строки, которые вы хотите сохранить, тогда возможно следующее, но не такое приятное, как решение в конце:
"a.messageid=X0001E\nnot interested line, but required in the output!\nb.messageid=Y0001E"
.lineSequence()
.map {
when {
matcherForIds.matches(it) -> transformIds(it)
else -> it
}
}
.forEach(::println)
В качестве альтернативы (теперь просто копируем регулярное выражение Wiktors, поскольку он уже содержит все, что нам нужно (полное соответствие от начала строки ^
до конца строки $
и т. д.)):
val matcherForIds = Regex("""^(.*\.messageid=)[XY]\d{4,6}E$""")
fun transformIds(line: String) = matcherForIds.replace(line) {
"${it.groupValues[1]}Z%05dE".format(idCounter++)
}
Таким образом, вы гарантируете, что строки, которые полностью соответствуюттребуемые входные данные заменяются, а остальные сохраняются, но не заменяются.