Движок Regex не соответствует всем вхождениям без очередного прохода - PullRequest
0 голосов
/ 11 февраля 2020

С учетом следующего kotlin кода;

println(introduceConditionalAndBetweenWordsWith1Passes("'AAA' 'BBB' 'CCC' 'DDDD'"))
println(introduceConditionalAndBetweenWordsWith2Passes("'AAA' 'BBB' 'CCC' 'DDDD'"))


fun introduceConditionalAndBetweenWordsWith1Passes(input: String): String {
    return input.replace("'(.*?)' '(.*?)'".toRegex(), "\'$1\' & '\$2'")

}
fun introduceConditionalAndBetweenWordsWith2Passes(input: String): String {
    val secondPass = input.replace("'(.*?)' '(.*?)'".toRegex(), "\'$1\' & '\$2'")
    return secondPass.replace("'(.*?)' '(.*?)'".toRegex(), "\'$1\' & '\$2'") //2  iterations to resolve the one that don't match the first pass
}

Произведет;

'AAA' & 'BBB' 'CCC' & 'DDDD'
'AAA' & 'BBB' & 'CCC' & 'DDDD'

Кажется, что механизм регулярных выражений обрабатывает 'AAA' и 'BBB' как 1 совпадение & 'CCC' и 'D DDD 'как второе совпадение (и так далее), однако я хочу, чтобы двигатель также совпадал с' BBB '&' CCC 'в этом примере

Вопрос в том; В регулярных выражениях, как мне добиться полного прочтения строки за один проход, который добавляет '&' между всеми словами, заключенными в одинарные кавычки?

1 Ответ

1 голос
/ 11 февраля 2020

Второе слово каждой пары является частью вашего совпадения, поэтому оно не может быть частью последующего совпадения. Вы можете посмотреть второе слово в каждой паре, а не включать его в совпадение:

input.replace("'(.*?)' (?='(.*?)')".toRegex(), "\'$1\' & ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...