用正则表达式获取双花括号中的任何内容

6

我需要在.NET中获取双花括号之间的文本。以下是代码:

\{{([^}]+)\}}

然而,这也包括双大括号。有没有办法将它们排除在外?

5个回答

11

我不是正则表达式的大师,但这应该可以工作,并回答了你关于仅选择元素之前和之后的问题。试试:

(?<=\{\{).*?(?=\}\})
如果您想知道为什么这个方法有效,我会给您解释一下:
(?<=\{\{) 是一个正向后瞻的开始符号,它匹配你要查找的内容之后的一个组,但不包括在结果中。这基本上是您所要求的第一部分。 \{\{) 是您实际要查找的转义字符。
.*? 表示您希望选择任何内容,任意次数(但尽可能少),直到您到达(?=\}\}) 组,它是一个正向前瞻,实际上是您要查找的第二部分。这将选择该选择器后面的所有内容,即两个转义结束大括号,而不选择大括号本身。

小心。自Safari 15.2版本(17612.3.6.1.6)起,正向后瞻将会破坏您的应用程序。 - NULL

2

Groups[0]是整个子字符串

Groups[1]及其后面的内容返回()之间的文本

尝试一下

new Regex(@"\{{([^}]+)\}}").Match("dfdf{{456gfd}}3453").Groups[1]

2

(此答案不特定于.NET)

对于一个基本的非贪婪捕获正则表达式(因此将匹配由双引号包围的最小字符串)并包括在匹配中的用单花括号括起来的文本:

最初的回答:

以下是一个基本的正则表达式,用于捕获非贪婪模式。它将匹配由双引号包围的最小字符串,并将花括号内的文本包括在匹配中:

{{(([^}][^}]?|[^}]}?)*)}}

示例

给定

{{first group}} nothing {{second {special} group}}

我们将得到以下捕获结果:
  • 第一组
  • 第二个{特殊}组

解释

  • {{:匹配开头的双括号
  • (...):我们想要的位置捕获
    • (...|...)*:匹配由两个用|分隔的替代项中的任何一个重复出现的内容
      • [^}][^}]?:匹配任何不是闭合双括号}}的内容(?是必需的,以确保我们可以匹配奇数和偶数长度的字符串)
      • [^}]}?:匹配一个可选的单个闭合括号,该括号不直接在之前的括号中出现。
  • }}:匹配闭合的双括号
注意:保留html标签。

0
也许我错了,但是我在https://regex101.com/上测试过了,除了java8之外,这似乎是有效的:
({{.*?}})

0
using System.Text.RegularExpressions;

string input = "This is a {{sample}} string with {{double}} curly braces.";

string pattern = @"\{\{(.*?)\}\}";

MatchCollection matches = Regex.Matches(input, pattern);

foreach (Match match in matches)
{
    string content = match.Groups[0].Value;
    Console.WriteLine("Content with braces: " + content);

    string content2 = match.Groups[1].Value;
    Console.WriteLine("Content without braces: " + content2);
}

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