. net正则表达式-最后一个重复字符

本文关键字:字符 最后一个 正则表达式 net | 更新日期: 2023-09-27 18:02:16

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

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

所以我用({[^}]+}+)来捕获内部文本,但当然这将产生多个捕获{{this}{{this}}

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

所以我尝试添加字符串选项({[^}]+}+)[$|^}]的结束,但由于某种原因,这将再次捕获{{this}。我不知道为什么,它应该只捕获如果下一个字符是输入结束或不是花括号…

建议吗?

编辑:

只是为了清楚,我不是在搜索有效的嵌套括号,只是在{和第一个匹配}之间的文本(没有嵌套!),但是可能有两个而不是一个开/闭大括号的情况(所以{something}和{{something}}都需要被捕获)。

这样做的原因是,原始文本总是有双括号{{}},但有时在正则表达式之前文本经历字符串。在这种情况下,双括号变成单括号。

. net正则表达式-最后一个重复字符

一般来说,regex不够强大,无法做到这一点。然而,.NET正则表达式引擎支持所谓的原子分组,它允许您处理具有平衡括号的组:

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

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

{+.*?}+

匹配大括号之间的所有内容,取所有连续的大括号和尽可能少的内部字符。

进一步解释:匹配1个或多个{ ({+),然后是任意数量的任意字符 (.*),但会给出最短的字符串 (?),最后匹配1+} (}+)。如果没有?,如果有{a} {b},它将匹配整个内容,而不是单独匹配{a}{b}

如果你不希望括号之间有空格,你可以这样使用:

{+'S*?}+

如果您只想要字母,请使用'w而不是'S

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


结果比较(应该是注释)。

考虑{{{{{{this}}}}}Blabla,我得到这个:

Regex author: c0d3rman

  • 匹配字符串:{{{{{{this}}}}}B
  • 组:2 ({{{{{{this}}}}}B{{{{{{this}}}}})
  • 捕获:{{{{{{this}}}}}

Regex author: dasblinkenlight

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

注意:对称大括号

Regex author: Andrew

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

您似乎在末尾使用了字符类而不是非捕获组。试一试:

({[^}]+}+)(?:$|[^}])

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

请注意,这不会平衡花括号(匹配开始和结束的花括号数量)。