Rexgex:如何在括号之间捕捉任何东西,除非括号之间

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

sanjiao0104 回答:Rexgex:如何在括号之间捕捉任何东西,除非括号之间

您可以在ECMA2018 +(V8或更高版本的引擎)中使用以下正则表达式。以前的版本不支持可变长度的后置。

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)(?!))\)
本文链接:https://www.f2er.com/2940817.html

大家都在问