我试图找到一个 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\([^()]*\)
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示。如果你想绝对确定}右边有一个结束,请在最后添加一个(?=[^{}]*})积极的前瞻:
(?:\G(?!\A)|{)[^{}]*?\K\([^()]*\)(?=[^{}]*})
Run Code Online (Sandbox Code Playgroud)
请参阅此正则表达式演示。
细节
(?:\G(?!\A)|{)- 前一个成功匹配的结尾或一个{字符[^{}]*?- 除{and之外的零个或多个字符},尽可能少\K - 匹配重置运算符,从当前的整体匹配内存缓冲区中丢弃所有匹配的文本\(- 一个(字符[^()]*-零个或多个字符以外(,并)尽可能多地\)- 一个)字符(?=[^{}]*})- 在右侧,除了{and}和 a之外,必须有零个或多个字符}。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)"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |