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