这里是正则表达式菜鸟
我有以下字符串:
This is a message {key1} {{key2}} {{{key3}}}, and includes {key4}.
我正在尝试提取外部大括号之间的任何内容。预计比赛:
key1
{key2}
{{key3}}
key4
大多数 SO 示例涵盖了单花括号或双花括号的匹配,但不是两者或任何变体。像
[^{\}]+(?=})
这样的表达式将获取内部大括号之间的内容,而 (?<=\{).*?(?=\})
将获取除第一个大括号之外的前导大括号,但不会获取尾部大括号。
您可能会得到您需要的结果
var results = Regex.Matches(text, @"{({*[^{}]*}*)}")
.Cast<Match>()
.Select(x => x.Groups[1].Value);
请参阅 正则表达式演示。
正则表达式详细信息
{
- 左花括号({*[^{}]*}*)
- 第 1 组:
{*
- 0 个或多个左花括号[^{}]*
- 除花括号外的 0 个或多个字符}*
- 0 个或多个右花括号}
- 右大括号奖励解决方案(在评论中提供)
如果您需要提取嵌套大括号之间的字符串,您可以使用
\{((?>[^{}]+|(?<c>{)|(?<-c>}))*)(?(c)(?!))}
请参阅此正则表达式演示。在这里,
\{
- 匹配 {
字符((?>[^{}]+|(?<c>{)|(?<-c>}))*)
- 第 1 组:除 {
和 }
之外的一个或多个字符的零次或多次重复,或 {
字符(推入组“c”堆栈)或 }
字符(从“c”组堆栈中弹出)(?(c)(?!))
- 检查:如果组“c”在其堆栈上仍然有值,则触发回溯(由无条件 (?!)
前瞻的“失败”引起)}
- 一个 }
字符。如果它们可以重叠:
(?=(\{((?>[^{}]+|(?<c>{)|(?<-c>}))*)(?(c)(?!))}))
只需按
match.Groups[1].Value
即可获取整个匹配项,或者仅在获得匹配项后按 match.Groups[2].Value
即可获取大括号内的文本。