我需要一个正则表达式来捕获括号之间的任何内容,除非它位于以下模式之间: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
时它会失败来自测试句子。
知道如何做吗?
编辑:应该像本例一样匹配,但考虑到 S :https://regex101.com/r/WzECSS/1
编辑:这个应该可以解决问题:(?<!S\[[^\]]+)\((?:[^()]|\([^)]*\))+\)
谢谢@ctwheels
编辑:当您将括号直接放在方括号后面时,之前的正则表达式会失败,如下所示:
“我是一个(测试)S[(但我(没有被捕获)],捕获(我(如果可以的话))”
有人知道如何解决这个问题吗?谢谢。
最佳答案
您可以在 ECMA2018+(V8 引擎或更高版本)中使用以下正则表达式。以前的版本不支持可变长度lookbehinds。
(?<!S\[[^\]]+)\((?:[^()]|\([^)]*\))+\)
这是如何工作的:
-
(?<!S\[[^\]]+)
负向后查找确保以下内容不匹配:-
S\[
匹配S[
从字面上看 -
[^\]]+
匹配除]
之外的任何字符一次或多次
-
-
\(
匹配(
从字面上看 -
(?:[^()]|\([^)]*\))+
匹配以下选项一次或多次-
[^()]
匹配除(
之外的任何字符和)
-
\([^)]*\)
匹配(
,然后是除)
之外的任何字符任意次数,然后)
-
-
\)
匹配)
从字面上看
但请注意,这仅匹配两个括号的深度(一组嵌套另一组)。您无法轻松在 JavaScript 的正则表达式引擎中平衡括号,因为当前不支持递归和其他标记。
This answer解释如何平衡不同正则表达式引擎中的括号(如果使用 XRegExp,则包括 JavaScript)。
其他语言中的一些实现示例 - 在 JavaScript 中不可能,因为它不包括递归、控制动词、平衡组等:
PCRE:See here
S\[[^]]*\](*SKIP)(*FAIL)|\((?:[^()]|(?R))*\)
.NET:See here
(?<!S\[[^\]]+)\((?:[^()]|(?<p>\()|(?<-p>\)))+(?(p)(?!))\)
编辑
更改lookbehind中的量词 +
至*
防止它匹配 S[(...)]
的大小写:
(?<!S\[[^\]]*)\((?:[^()]|\([^)]*\))+\)
关于javascript - 正则表达式 : How to catch anything between parenthesis except when its between square brackets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59288461/