相同的字符转义序列

3

我想匹配大括号中的数字,但是大括号本身是转义序列,当有奇数个大括号的时候,我希望匹配从最后一个大括号开始。

{0}    OK
{{0}   NOT OK
{{{0}  OK
{{{{0} NOT OK

我已经看到/向后查找断言,就像这样:

(?<!\{\{)

但是这与重复的匹配{{{0}不符合,我其实不确定是否可以在不涉及组和限定符的情况下完成此操作。(如果断言不是匹配的一部分,那就更好了)

匹配必须能够出现在字符串的任何位置。

这是我迄今为止得到的最好结果

(?<=^|[^\{]|\{\{)\{(?=\w)

除了这部分{{{{0},它在其他地方都成功了。 将量词放在大括号对上似乎没有任何效果。 根据文档,零宽度正回顾断言的子表达式不应有限制,但它并没有产生预期的效果。

1个回答

1

以你的尝试为基础,试试这个:

(?<!\{)\{(?:\{\{)*(?=\w)

一个解释:
  • (?<!\{) 确保前面没有 {
  • \{ 匹配一个 {
  • (?:\{\{)* 匹配零个或多个 {{(总共始终是奇数个 {
  • (?=\w) 确保后面有一些单词字符

你必须稍微重新排列一下才能让它正常工作。那部分让我感到惊讶。 - John Leidegren
@John Leidegren:如果你想知道我为什么使用\{(?:\{\{)*而不是(?:\{\{)*\{:它们是完全等价的。而(?...)只是一个匹配字符串但不被引用的组(所谓的非捕获组)。 - Gumbo
但是你将重复操作移出了断言。我认为这就是让我感到困惑的原因。我试图使用重复来进行断言,但我认为这是不可能的。 - John Leidegren
@John Leidegren:是的,说得好。由于性能原因,在后顾断言中通常不允许任意重复(例如*+{x,}等)。 - Gumbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接