我必须提取字符串的一部分,实际上将它分成有空格的地方。但是因为我想要提取的部分内部可能还有空格,所以我找到了一个正则表达式,因为它们被忽略,实际上当这些空间在括号之间时。请注意,我不完全理解正则表达式中的替代方法,进行了大量测试,并且我使用一个括号级别(示例中的第一个日志)进行管理。也可能没有括号,所以我找到了最后一个替代方法(|[^\s]+
)来获得tag1
之类的东西。
在经过大量(不工作)测试之后,我发现了第二个正则表达式,它包含第一个正则表达式的第一个替代版本,修改为识别第二级嵌套,然后是整个第一个正则表达式作为第二个替代版本。
这个工作正常(只要没有第三个嵌套级别,请看示例),但我觉得应该有一个更简单的解决方案,因为模式似乎是递归的(新的嵌套级别+整个最后等级regexp)。
有没有办法以更一般的方式解决这个问题(也许不是无限的嵌套级别,但让我们说4或5深?)。也许用recursive regexp?
var str = "tag1 tag2 func(foo) func2(foo, bar) func1(func2(foo), bar, func2(bar)) func1(func2(foo, func1(foo)), bar)";
console.log( str.match(/([^\s]*\([^()]+\)[^\s]*|[^\s]+)/g) );
console.log( str.match(/([^\s]*\((?:[^()]*\([^()]+\)[^()]*)+\)[^\s]*|(?:[^\s]*\([^()]+\)[^\s]*|[^\s]+))/g) );
编辑:我并不挑剔被标记为重复,但请注意我搜索了很多关于这个问题(匹配模式,排除模式在某些字符之间,在有限的嵌套级别)。我的问题是具体的,递归正则表达式只是一个解决它的建议,而不是主要部分。实际上标记为重复的主题对我没有任何帮助..