我有下一个字符串和正则表达式用于分割它:
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/