javascript - 正则表达式 : How to catch anything between parenthesis except when its between square brackets

标签 javascript regex brackets

我需要一个正则表达式来捕获括号之间的任何内容,除非它位于以下模式之间: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。

See regex in use here

(?<!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/

相关文章:

python - 如何匹配所有不包含连续两位数字的单词?

Java递归匹配txt中的括号

python - 如何按方括号之间的内容进行数字排序

javascript - 在javascript中使变量成为函数

javascript - Jade,为什么变量在一种情况下用单引号发送,而在另一种情况下不加引号?

javascript - Sharepoint Teamsite-calendar-webpart - 将约会保存到 Outlook

javascript - JavaScript 中的简单代谢率计算

regex - 按分隔符拆分字符串并在新行上打印元素

python - 拆分字符串(在空格或标点符号上)以获取所有数字

java - 编码性 : Brackets Determine whether a given string of parentheses is properly nested