Rexgex:如何在括号之间捕获任何东西,但方括号之间时除外

问题描述 投票:1回答:1

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

javascript regex brackets
1个回答
0
投票

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

See regex in use here

(?<!S\[[^\]]+)\((?:[^()]|\([^)]*\))+\)

这是如何工作的:

  • (?<!S\[[^\]]+)否定性后面确保以下内容不匹配:
    • [S\[从字面上匹配S[
    • [[^\]]+匹配除]以外的任何字符一次或多次
  • [\(从字面上匹配(
  • (?:[^()]|\([^)]*\))+匹配以下选项之一或多次
    • [[^()]匹配除()]以外的任何字符>
    • [\([^)]*\)匹配(,然后匹配除)之外的任何字符任意次,然后匹配)
  • [\)从字面上匹配)
  • © www.soinside.com 2019 - 2024. All rights reserved.