匹配两个大括号之间的所有括号

我试图找到一个 RegEx 模式,只要这些括号在{和之间,我就可以匹配所有括号(及其内容)}

例子:

  • {foo (i,j) bar} 应该匹配 (i,j)
  • {(i,j) foo (k,l) bar (m,n,o)}应该匹配(i,j)(k,l)(m,n,o)
  • foo (i,j) bar 不应该匹配任何东西,因为字符串不在花括号之间。
  • {foo (i,j) bar} (k,l)应该匹配(i,j)但不是(k,l)因为后者在漩涡括号之外。

我最接近的是这种模式:(?<={)[^(].*(.*?).*(?=}). 此模式在第一个、第二个和第四个示例上匹配,但与花括号之间的所有内容匹配,而不仅仅是括号及其内容。

回答

您可以使用

(?:G(?!A)|{)[^{}]*?K([^()]*)

请参阅正则表达式演示。如果你想绝对确定}右边有一个结束,请在最后添加一个(?=[^{}]*})积极的前瞻:

(?:G(?!A)|{)[^{}]*?K([^()]*)(?=[^{}]*})

请参阅此正则表达式演示。

细节

  • (?:G(?!A)|{)- 前一个成功匹配的结尾或一个{字符
  • [^{}]*?- 除{and之外的零个或多个字符},尽可能少
  • K - 匹配重置运算符,从当前的整体匹配内存缓冲区中丢弃所有匹配的文本
  • (- 一个(字符
  • [^()]*-零个或多个字符以外(,并)尽可能多地
  • )- 一个)字符
  • (?=[^{}]*})- 在右侧,除了{and}和 a之外,必须有零个或多个字符}

在线查看R 演示:

x <- "{(i,j) foo (k,l) bar (m,n,o)} should match on (h,j), (a,s), and (i,o,g)."
regmatches(x, gregexpr("(?:G(?!A)|{)[^{}]*?K([^()]*)(?=[^{}]*})", x, perl=TRUE))
# [[1]]
# [1] "(i,j)"   "(k,l)"   "(m,n,o)"


以上是匹配两个大括号之间的所有括号的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>