Ваш MULTILINE
в коде выдает ошибку и не работает.Может быть, из-за какого-то пропавшего импорта, но я совсем не знаю Kotlin.Но, похоже, что MULTILINE
похоже на DOTALL
, чтобы включить сопоставление точек с новой строкой..*
в вашем регулярном выражении является жадным, поэтому даже если я заставлю ваше регулярное выражение работать, он заменит вторую версию в вашем тексте, следовательно, вы должны использовать не жадную версию в своем регулярном выражении [\\w\\W]*?
, и \\S+
соответствует одному или несколькимнепробельные символы и будут соответствовать 1.7.0
, хотя вы даже можете написать его как \\d+(\\.\\d+)*
, если хотите точно соответствовать версии, состоящей только из цифр.
Я удалил MULTILINE
из вашего кода и исправил регулярное выражение,который, кажется, работает нормально.Проверьте этот измененный код,
fun main(args: Array<String>) {
val content = """releases:
web-env:
version: 1.7.0
enabled: true
web-app:
enabled: true
version: 1.39.0
"""
val chart = "web-env"
val version = "new version"
val regex = "($chart:[\\w\\W]*?version: )(\\S+)".toRegex()
val replace = content.replaceFirst(regex, "$1$version")
println(replace)
}
Примечание: [\\w\\W]
- это еще один способ включить сопоставление любого символа, включая символ новой строки.
Это выводит следующий вывод, который, как я предполагаю, вы ожидаете,
releases:
web-env:
version: new version
enabled: true
web-app:
enabled: true
version: 1.39.0
Демонстрация кода Kotlin
Надеюсь, что это хорошо работает, и дайте мне знать по любым вопросам.