Разделите с помощью регулярного выражения с несколькими символами и оставьте разделители - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть следующая строка и регулярное выражение для ее разбиения:

val str = "this is #[loc] sparta"
val regex = "((?<=( #\\[\\w{3,100}\\] ))|(?=( #\\[\\w{3,100}\\] )))"
print(str.split(Regex(regex)))

//print - [this is,  #[loc] , sparta]

Работает нормально. Но в разработке я не понял, когда в блоке # [***] должен быть не только текст (\ w) - у него есть и "-", и цифры (UUID), а мои правильные блоки - -

val str = "this is #[loc_75acca83-a39b-4df1-8c3c-b690df00db62]"

и в этом случае регулярное выражение не работает.

Как изменить эту часть - "\ w {3,100}" для новых требований?

Я пытаюсь изменить на любое - "\. {3,100}" - не работает

1 Ответ

0 голосов
/ 18 сентября 2018

Чтобы исправить вашу проблему, вы можете заменить свое регулярное выражение на

val regex = """((?<=( #\[[^\]\[]{3,100}] ))|(?=( #\[[^\]\[]{3,100}] )))"""

. \w можно заменить на [^\]\[], что соответствует любому символу, но [ и ].

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

См. Kotlin online demo .

Кроме того, вы можете использовать следующий метод для разделения и сохранения разделителей:

private fun splitKeepDelims(s: String, rx: Regex, keep_empty: Boolean = true) : MutableList<String> {
    var res = mutableListOf<String>() // Declare the mutable list var
    var start = 0                     // Define var for substring start pos
    rx.findAll(s).forEach {           // Looking for matches     
        val substr_before = s.substring(start, it.range.first()) // // Substring before match start
        if (substr_before.length > 0 || keep_empty) {
            res.add(substr_before)      // Adding substring before match start
        }
        res.add(it.value)               // Adding match          
        start = it.range.last()+1       // Updating start pos of next substring before match
    }
    if ( start != s.length ) res.add(s.substring(start))  // Adding text after last match if any
    return res
}

Затем просто используйте его как

val str = "this is #[loc_75acca83-a39b-4df1-8c3c-b690df00db62] sparta"
val regex = """#\[[\]\[]+]""".toRegex()
print(splitKeepDelims(str, regex))
// => [this is , #[loc_75acca83-a39b-4df1-8c3c-b690df00db62],  sparta]

См. Демонстрационную версию Kotlin .

Шаблон \[[^\]\[]+] соответствует

  • \[ - [ char
  • [^\]\[]+ - 1+ символов, отличных от [и ]
  • ] - ] char.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...