【发布时间】:2019-12-11 14:54:00
【问题描述】:
我需要一个正则表达式来捕获括号之间的任何内容,除非它位于以下模式之间,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[(但我是(没有被抓住)],抓住(我(如果可以的话))”
有没有人知道如何解决这个问题。谢谢。
【问题讨论】:
-
请为您的示例指定预期结果。
-
你不能只做两遍吗?
replace(/S\[^]+\]/g,'')然后捕获匹配的括号? -
如果您将其设为像
S\[.*?\]|(\(.*?\))这样的布尔值,那么您想要的结果将在$1中。如果您需要从输入中删除S,则可以像S?\[.*?\]|(\(.*?\))这样在正则表达式中将S设为可选,或者将其从正则表达式中删除。 -
试试 this:
(?<=(?<!S)\[[^\]]*)\([^)]+\)(?=[^[]*\])|(?<=\([^)]*)\([^)]+\)(?=[^(]*\))- 需要 ECMA2018+ 才能进行变量后视。 -
试试
(?<!S\[[^\]]+)\((?:[^()]|\([^)]*\))+\)
标签: javascript regex brackets