【问题标题】:Match everything inside brackets (nested brackets) [duplicate]匹配括号内的所有内容(嵌套括号)[重复]
【发布时间】:2018-01-18 13:58:16
【问题描述】:

我有一个匹配括号内所有内容的正则表达式:

 ?\(.*?\)

我需要调整这个正则表达式,所以它也匹配嵌套的括号,例如:

ABC ( DEF (GHI) JKL ) MNO

在本例中应匹配 ( DEF (GHI) JKL )

【问题讨论】:

  • 请问示例中的预期匹配是什么?
  • 更新问题
  • 假设我们有一个详细示例:ABC (DEF (GHI) JKL) MNO (PQR) (UV (XYZ) 那么答案是什么? {(DEF (GHI) JKL)、(PQR)}、{(DEF (GHI) JKL) MNO (PQR) (UV (XYZ)} 还是其他?
  • 您的意思是您需要删除嵌套括号内的所有子字符串吗? This solution 应该实际工作。但还有一个:while (Regex.IsMatch(s, @"\([^()]*\)")) { s = Regex.Replace(s, @"\([^()]*\)", ""); }

标签: c# regex


【解决方案1】:

要匹配ABC ( DEF (GHI) JKL ) MNO 中的( DEF (GHI) JKL ),您应该在示例正则表达式中将.*? 更改为.*:

\(.*\)

.*? 是惰性的 - 它会匹配尽可能短的字符串;

.* 是贪婪的 - 它会匹配最长的字符串。

【讨论】:

  • 你的答案很完美!除了一种情况 - “这是 ABC (XXX) DEF (XXX) (XXX)”。对于这个字符串,我希望删除所有 (XXX) 并拥有这个 - “这是 ABC DEF”。但由于某些原因,正则表达式也删除了“DEF”。
【解决方案2】:

如果你想匹配:

ABC (DEF (GHI) JKL) MNO

这行得通:

?\(.*\)

参考:https://regex101.com/r/5Y5ZM0/2

编辑:更新为来自@GameDroids 的更短的工作版本

【讨论】:

  • 在您的示例中,\(.*\) 这也有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多