正则表达式:获取任何大括号之间的任何内容

问题描述 投票:0回答:1

这里是正则表达式菜鸟

我有以下字符串:

This is a message {key1} {{key2}} {{{key3}}}, and includes {key4}.

我正在尝试提取外部大括号之间的任何内容。预计比赛:

key1
{key2}
{{key3}}
key4

大多数 SO 示例涵盖了单花括号或双花括号的匹配,但不是两者或任何变体。像

[^{\}]+(?=})
这样的表达式将获取内部大括号之间的内容,而
(?<=\{).*?(?=\})
将获取除第一个大括号之外的前导大括号,但不会获取尾部大括号。

c# regex .net-core
1个回答
4
投票

您可能会得到您需要的结果

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
即可获取大括号内的文本。

© www.soinside.com 2019 - 2024. All rights reserved.