regex - 使用多字符正则表达式模式进行分割并保留分隔符

标签 regex kotlin

我有下一个字符串和正则表达式用于分割它:

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

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

工作正常。但在开发中我没有意识到 #[***] block 中的时间必须不仅仅是文本(\w) - 他有和“-”和数字(UUID),而我的正确 block 是 -

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

在这种情况下,正则表达式不起作用。

如何更改这部分 - “\w{3,100}”以满足新要求?

我尝试更改为任何 - “\.{3,100}” - 不起作用

最佳答案

要解决您的问题,您可以将正则表达式替换为

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 demo .

\[[^\]\[]+] 模式匹配

  • \[ - 一个 [ 字符
  • [^\]\[]+ - 除 [] 之外的 1+ 个字符
  • ] - ] 字符。

关于regex - 使用多字符正则表达式模式进行分割并保留分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52384200/

相关文章:

java - 查找字符串中的小数

java - 从 html 页面中提取元素的最佳方法?

android - 在 SplashActivity 中显示的 Firebase 应用内消息。如何在 MainActivity 中显示它?

java - 使用 Android Assets zip 文件时出现 FileNotFound 异常

kotlin - 父类的init block 中的null值

regex - powershell - 匹配字符串,如果它具有某个字符之一。即姓氏_名字与姓氏_名字_中间名不匹配

regex - 如何在 Notepad++ 中提取方括号之间的逗号?

regex - 使用 UNIX/Linux 操作(排除行).csv 文件的特定列

java - LibGDX:Kotlin 与 Java

javafx - 在 tornadofx 中创建自定义 UI 组件的最佳实践是什么?