匹配两个大括号之间的所有括号
我试图找到一个 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)"