正则表达式拆分用户定义的字符串

时间:2019-03-13 09:54:14

标签: javascript regex

我必须拆分一个用户定义的字符串,看起来像这样

[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

2 个答案:

答案 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(/(?<=\])|(?=\[)/))

(?<=\]):正向查找:在拆分之前搜索]
(?=\[)/):积极向前看:分割后搜索[