C# .Net正则表达式-重复字符的最后一个

C# .Net正则表达式-重复字符的最后一个,c#,regex,C#,Regex,我试图捕捉花括号内的所有内容,但在某些情况下,可能会有多个大括号,我需要外部大括号 例如:我想捕获{{this}}部分 我需要{{this}}作为捕获 因此,我使用了({[^}]+}+来捕获内部文本,但这当然会产生多个捕获{{{this}和{{this} 因此,我尝试告诉正则表达式搜索短语,但前提是下一个字符不是大括号:({[^}]+}+[^}]。这是可行的,除非捕获在输入的末尾,在这种情况下它不起作用,因为它希望在末尾有一个非}字符 因此,我尝试添加字符串结尾选项({[^}]+}+[$^}],

我试图捕捉花括号内的所有内容,但在某些情况下,可能会有多个大括号,我需要外部大括号

例如:我想捕获
{{this}}
部分 我需要
{{this}}
作为捕获

因此,我使用了
({[^}]+}+
来捕获内部文本,但这当然会产生多个捕获
{{{this}
{{this}

因此,我尝试告诉正则表达式搜索短语,但前提是下一个字符不是大括号:
({[^}]+}+[^}]
。这是可行的,除非捕获在输入的末尾,在这种情况下它不起作用,因为它希望在末尾有一个非
}
字符

因此,我尝试添加字符串结尾选项
({[^}]+}+[$^}]
,但出于某种原因,这将再次捕获
{{this}
。我不知道为什么,它应该只捕获下一个字符是输入结尾还是不是大括号

建议

编辑:

需要明确的是,我没有搜索有效的嵌套括号,只搜索{和第一个匹配的}(没有嵌套!)之间的文本,但是可能会出现这样的情况,即不是一个开/闭大括号,而是两个括号(因此{something}和{{{something}}都需要捕获)


原因是,原始文本总是有双大括号{{},但有时在正则表达式之前,文本会使用string.Format,在这种情况下,双大括号会变成单大括号。

您似乎在结尾使用了字符类,而不是非捕获组。请尝试:

({[^}]+}+)(?:$|[^}])
这是对您的最后一次尝试的一个非常小的修改,只是使用了正确的语法。在您的最后一次尝试中,您有
[$| ^}]
。这样做的问题是,在字符类
[]
中不能有or。大多数特殊字符在字符类内转义,但有几个例外,其中一个例外是
^
(如果它是第一个字符)。因此
[$| ^}]
表示四个文字字符
$
^
}
中的任意一个。我所做的是通过使用非捕获组
(?:stuff)
将语法更改为您想要的语法。此组不保存其内容,仅用于分组。因此,
(?:$|[^}])
表示您想要的行尾或非行尾


请注意,这样做不会使花括号保持平衡(匹配开头和结尾的大括号数量)。

一般来说,regex的功能不足以做到这一点。但是,.NET正则表达式引擎支持所谓的,允许您使用平衡括号处理组:

{(?>{(?<DEPTH>)|}(?<-DEPTH>)|[^}]+)*}(?(DEPTH)(?!))
{(?>{(?)}(?)[^}]+)*}(?(深度)(?!)

如果要匹配大括号之间的所有文本,我认为这应该可以做到:

{+.*?}+
这将匹配大括号之间的所有内容,使用所有连续大括号并尽可能少的内部字符

进一步说明:匹配1个或多个{(
{+
),然后匹配任意数量的字符(
*
),但会提供执行该操作的最短字符串(
),最后匹配1+}(
}+
)。没有这个
,如果你有
{a}{b}
,它将匹配整个东西,而不是分别匹配
{a}
{b}

如果不希望大括号之间留有空格,可以使用以下方法:

{+\S*?}+
如果只需要字母,请使用
\w
而不是
\S

唯一没有验证的是使用了相同数量的大括号。你需要吗


结果比较(应为注释)

考虑到
{{{{{{{{{{{{{{{{}}}}Blabla
,我得到以下结论:

Regex作者:c0d3rman

  • 匹配字符串:
    {{{{{{{{this}}}B
  • 组:2(
    {{{{{{{{{{{{{{{{{}}}B
    {{{{{{{{{{{{{{{{{}}}}
  • 捕获:
    {{{{{{{{{this}}
Regex作者:dasblinkenlight

  • 匹配字符串:
    {{{{{{{this}}
  • 组:2(
    {{{{{{{{{{{{}}
    {}
  • 捕获:
    {{{{{{{{this}}
注:对称大括号

正则表达式作者:安德鲁

  • 匹配字符串:
    {{{{{{{{this}}
  • 组:
    {{{{{{{{{this}}
  • 捕获:
    {{{{{{{{{this}}

是否要捕获第二个{{this}而不是第一个?如果是,这是您想要的吗?如果字符串具有
{text}
,是否要捕获除最后一个大括号外的所有内容?还是什么都不捕获?第一个开始大括号和第一个连续结束大括号之间的所有内容,包括大括号本身。编辑问题以更好地解释。因此,是否需要匹配所有
{{{{this}}
但捕获
{{{this}}
{{this}}
{this}
?我需要匹配并捕获{{{{{{{{{{{this}},当有连续的大括号时,我希望它们都匹配并捕获,数量无关紧要,每个开始的大括号是否都有结束的大括号也无关紧要。
可能有多个大括号,我想要外部的大括号。
-我认为他不懂嵌套或平衡。+1是正确的解决方案,但他可能不懂它..很复杂但很酷。你可能想用
[^}\\s]+
来避免空格(我想它们是无效的)。另外,如果他只寻找相邻的(内部的)
{{{{{{{
}}}
类似于
{(?>,这似乎太复杂了。有没有办法说“这个字符或字符串的结尾”如果我想要一个以“ed”结尾的单词,我想要“ed”,然后是任何空格或字符串的结尾。这不能用简单的方法来完成?实际上这正是我需要的,来匹配{this}}(整个事情)不仅仅是内括号。我不是在寻找平衡括号。请看我对问题的编辑。这似乎非常有效。你能解释一下你在这里做了什么吗,我不熟悉这些。