我需要一个正则表达式来捕获括号之间的所有内容,除非它位于以下模式之间,即S
字符后跟方括号:
S[]
就像这句话:
I am a (test) S[ but i am (not catched)], catch (me (if you can))
^^^^^^ ^^^^^^^^^^^^^^^^^ # should be matched
^^^^^^^^^^^^^^^^^^^^^^^^^^ # should not be matched
它也应捕获嵌套的括号。
我尝试使用各种示例来使其工作,但我得到的最接近的是这个示例:
(?![^S\[]*\])\(([^()]*|\(([^()]*|\(([^()]*|\([^()]*\))*\))*\))*\)?
=>,但是当您从测试语句中删除S
时,它将失败。
任何想法怎么做?
Edit:在这种情况下应匹配,但考虑到S:https://regex101.com/r/WzECSS/1
编辑:这应该可以解决问题:(?<!S\[[^\]]+)\((?:[^()]|\([^)]*\))+\)
谢谢@ctwheels
您可以在ECMA2018 +(V8或更高版本的引擎)中使用以下正则表达式。以前的版本不支持可变长度的后置。
(?<!S\[[^\]]+)\((?:[^()]|\([^)]*\))+\)
这是如何工作的:
(?<!S\[[^\]]+)
否定性后面确保以下内容不匹配:S\[
从字面上匹配S[
[^\]]+
匹配除]
以外的任何字符一次或多次\(
从字面上匹配(
(?:[^()]|\([^)]*\))+
匹配以下选项之一或多次[^()]
匹配除(
和)
]以外的任何字符>\([^)]*\)
匹配(
,然后匹配除)
之外的任何字符任意次,然后匹配)
\)
从字面上匹配)