我必须拆分一个用户定义的字符串,看起来像这样
[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]
最后,我想在js中获得一个看起来像这样的列表
["[test1]", "-", "[test2]", ">>", "[test3]", "Some Text:", "[test4]", "|test:", "[test199]", "|some_text:", "[test0]", "[test100]"]
所以我希望通过[]括号中的变量和不包含在括号中的所有内容来分割文本。
这里的问题是,我只能为[]括号中的所有内容获得解决方案,或者获得或多或少的静态解决方案。
[]括号中的所有内容
(\[.*?\])
不完全正确的正则表达式
((\[.*?\]))|([a-zA-Z0-9->:|_ ]*(?!\]))
例如,这将不适用于这样的文本
[test100
答案 0 :(得分:3)
由于您不在乎是否有嵌套的括号,因此可以使用
s.split(/(\[[^\][]*])/).filter(Boolean)
(\[[^\][]*])
模式匹配并将[
捕获到组1中,然后捕获除[
和]
之后的任意0+字符,然后捕获]
,以及使用它将字符串拆分为多个块,同时将匹配和不匹配的块都保存到结果数组中。
如果有相邻的块,或者它位于字符串的开头/结尾,则可能会出现空项,.filter(Boolean)
会删除它们。
请参阅JS演示
console.log(
"[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]"
.split(/(\[[^\][]*])/).filter(Boolean)
)
答案 1 :(得分:1)
您可以使用积极的环顾方式:
str = "[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]"
console.log(str.split(/(?<=\])|(?=\[)/))
(?<=\])
:正向查找:在拆分之前搜索]
(?=\[)/)
:积极向前看:分割后搜索[