Java / Kotlin: токенизация строки, игнорирующая содержимое вложенных кавычек - PullRequest
0 голосов
/ 04 февраля 2019

Я хотел бы разделить символ пробелами, но оставить пробелы внутри кавычек (и самих кавычек).Проблема в том, что кавычки могут быть вложенными, а также мне нужно сделать это как для одинарных, так и для двойных кавычек.Итак, из строки this "'"is a possible option"'" and ""so is this"" and '''this one too''' and even ""mismatched quotes" я бы хотел получить [this, "'"is a possible option"'", and, ""so is this"", and, '''this one too''', and, even, ""mismatched quotes"].

Этот вопрос уже был задан, но не тот, который я задаю. Здесь есть несколько решений: в одном используется средство сравнения (в данном случае """x""" будет разделено на [""", x"""], так что это не то, что мне нужно) и Apache Commons (который работает с """x""", но нес ""x"", поскольку он берет первые две двойные кавычки и оставляет последние два с x).Есть также предложения написать функцию для этого вручную, но это будет последним средством.

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете достичь этого с помощью следующего регулярного выражения: ["']+[^"']+?["']+.Используя этот шаблон, вы извлекаете индексы, где вы хотите разделить, следующим образом:

val indices = Regex(pattern).findAll(this).map{ listOf(it.range.start, it.range.endInclusive) }.flatten().toMutableList()

Остальное строит список из подстрок.Здесь полная функция:

fun String.splitByPattern(pattern: String): List<String> {

    val indices = Regex(pattern).findAll(this).map{ listOf(it.range.start, it.range.endInclusive) }.flatten().toMutableList()

    var lastIndex = 0
    return indices.mapIndexed { i, ele ->

        val end = if(i % 2 == 0) ele else ele + 1 // magic

        substring(lastIndex, end).apply {
            lastIndex = end
        }
    }
}

Использование:

val str = """
this "'"is a possible option"'" and ""so is this"" and '''this one too''' and even ""mismatched quotes"
""".trim()

println(str.splitByPattern("""["']+[^"']+?["']+"""))

Вывод:

[this, "'" является возможной опцией "'",и, "" и это тоже "", и "," и это тоже ", и даже," "несовпадающие цитаты"]

Попробуйте это на игровой площадке Котлина !

...