我需要在.NET中获取双花括号之间的文本。以下是代码:
\{{([^}]+)\}}
然而,这也包括双大括号。有没有办法将它们排除在外?
我不是正则表达式的大师,但这应该可以工作,并回答了你关于仅选择元素之前和之后的问题。试试:
(?<=\{\{).*?(?=\}\})
如果您想知道为什么这个方法有效,我会给您解释一下:(?<=\{\{)
是一个正向后瞻的开始符号,它匹配你要查找的内容之后的一个组,但不包括在结果中。这基本上是您所要求的第一部分。 \{\{)
是您实际要查找的转义字符。.*?
表示您希望选择任何内容,任意次数(但尽可能少),直到您到达(?=\}\})
组,它是一个正向前瞻,实际上是您要查找的第二部分。这将选择该选择器后面的所有内容,即两个转义结束大括号,而不选择大括号本身。Groups[0]是整个子字符串
Groups[1]及其后面的内容返回()之间的文本
尝试一下
new Regex(@"\{{([^}]+)\}}").Match("dfdf{{456gfd}}3453").Groups[1]
(此答案不特定于.NET)
对于一个基本的非贪婪捕获正则表达式(因此将匹配由双引号包围的最小字符串)并包括在匹配中的用单花括号括起来的文本:
最初的回答:
以下是一个基本的正则表达式,用于捕获非贪婪模式。它将匹配由双引号包围的最小字符串,并将花括号内的文本包括在匹配中:
{{(([^}][^}]?|[^}]}?)*)}}
给定
{{first group}} nothing {{second {special} group}}
第一组
第二个{特殊}组
{{
:匹配开头的双括号(
...)
:我们想要的位置捕获
(...|...)*
:匹配由两个用|
分隔的替代项中的任何一个重复出现的内容
[^}][^}]?
:匹配任何不是闭合双括号}}
的内容(?
是必需的,以确保我们可以匹配奇数和偶数长度的字符串)[^}]}?
:匹配一个可选的单个闭合括号,该括号不直接在之前的括号中出现。}}
:匹配闭合的双括号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);
}