. net正则表达式-最后一个重复字符
本文关键字:字符 最后一个 正则表达式 net | 更新日期: 2023-09-27 18:02:16
我试图捕捉花括号内的所有内容,但在某些情况下,可能有多个花括号,我想要外部的。
例如:我想捕获{{this}}
部分我需要{{this}}
作为捕获
所以我用({[^}]+}+)
来捕获内部文本,但当然这将产生多个捕获{{this}
和{{this}}
。
所以我试着告诉正则表达式搜索短语,但前提是下一个字符不是花括号:({[^}]+}+)[^}]
。这是有效的,除非捕获是在输入的末尾,在这种情况下,它不起作用,因为它期望在末尾有一个非}
字符。
所以我尝试添加字符串选项({[^}]+}+)[$|^}]
的结束,但由于某种原因,这将再次捕获{{this}
。我不知道为什么,它应该只捕获如果下一个字符是输入结束或不是花括号…
建议吗?
编辑:只是为了清楚,我不是在搜索有效的嵌套括号,只是在{和第一个匹配}之间的文本(没有嵌套!),但是可能有两个而不是一个开/闭大括号的情况(所以{something}和{{something}}都需要被捕获)。
这样做的原因是,原始文本总是有双括号{{}},但有时在正则表达式之前文本经历字符串。在这种情况下,双括号变成单括号。
一般来说,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
- 匹配字符串:
- 组:2 (
{{{{{this}}}}}
和{}
) - 捕获:
{{{{{this}}}}}
{{{{{this}}}}}
注意:对称大括号
Regex author: Andrew
- 匹配字符串:
{{{{{{this}}}}}
- Groups:
{{{{{{this}}}}}
- 捕获:
{{{{{{this}}}}}
您似乎在末尾使用了字符类而不是非捕获组。试一试:
({[^}]+}+)(?:$|[^}])
这是对你最后一次尝试的一个很小的修改,只是使用了正确的语法。在你的最后一次尝试中,你有[$|^}]
。这样做的问题是,您不能在字符类[]
中使用或|
。大多数特殊字符在字符类中被转义,除了几个例外,其中一个是^
,如果它是第一个字符。因此,[$|^}]
表示四个文字字符$
、|
、^
或}
中的任何一个。我所做的是通过使用非捕获组(?:stuff)
将语法更改为您想要的语法,该组不保存其内容,纯粹用于分组。因此,(?:$|[^}])
表示行尾或非}
,如您所愿。
请注意,这不会平衡花括号(匹配开始和结束的花括号数量)。