正则表达式分割用户自定义字符串

3

我需要分割一个用户定义的字符串,它可能看起来像这样

[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

1
可以有嵌套的括号吗?如果不行,请使用.split(/(\[[^\][]*])/).filter(Boolean) - Wiktor Stribiżew
1
@WiktorStribiżew 可能存在括号内嵌括号的情况,例如[[test1]]。最好的解决方案是["[", "[test1]", "]"]。 - JonasR
那么 (\[.*?\]) 对你来说甚至部分都没有起作用。 - Wiktor Stribiżew
1
是的,这就是我的问题,我的正则表达式只适用于这个例子 :) - JonasR
结果["[test1", "[test2]", "]>>", "[test3]"]对我来说很好。正如您可以在我的第一条评论中看到的那样,这就是我想要的东西。 - JonasR
显示剩余2条评论
2个回答

3

如果您不关心是否有嵌套括号,可以使用

s.split(/(\[[^\][]*])/).filter(Boolean)
(\[[^\][]*])模式匹配并捕获一个[,然后是除了[]之外的0个或多个字符,最后是],并使用它将字符串拆分为块,同时将匹配和非匹配的块保存到结果数组中。
如果有相邻的块或位于字符串的开头/结尾,则可能会出现空项。通过使用.filter(Boolean)来摆脱空项。
请参见JS演示:

console.log(
    "[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]"
        .split(/(\[[^\][]*])/).filter(Boolean)
)


1
您可以使用正向先行断言:

str = "[test1]-[test2]>>[test3]Some Text:[test4]|test:[test199]|some_text:[test0][test100]"

console.log(str.split(/(?<=\])|(?=\[)/))

(?<=\]):正向后瞻:在分割之前搜索]

(?=\[)/):正向前瞻:在分割之后搜索[


1
谢谢你的回答。结果看起来像我需要的。我已经接受了另一个解决方案,因为它比你的先发布。我会进行比较,看看哪个更适合我使用。 - JonasR
1
请注意,只有Chrome支持后顾。 - Toto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接