如何在替换中排除正则表达式值

时间:2013-09-03 11:08:06

标签: c# regex

我有一个正则表达式,它使用前缀和后缀搜索字符串。最简单的格式\$\$\w+\$\$会找到$$My_Name$$(在这种情况下,前缀和后缀都等于$$)另一个例子是\[\#\w+\#\]来匹配[#My_Name#]

Prefix和Suffix将始终是一个0到n个字符的特定字符串,我总是可以安全地转义它以进行直接的字符匹配。

我在C#代码中提取了匹配,因此我可以使用它们,但显然我的匹配包含$$My_Name$$但我想要的只是获取后缀和前缀之间的内部字符串:My_Name

如何从结果中排除前缀和后缀?

4 个答案:

答案 0 :(得分:2)

将您的REGEX更改为\$\$(\w+)\$\$并使用$1获取匹配(内部)字符串。

例如

string pattern = @"\$\$(\w+)\$\$";
string input = "$$My_Name$$";
Regex rgx = new Regex(pattern);
Match result = rgx.Match(input);
Console.WriteLine(result.Groups[1]);

输出:"My Name"

P.S - 没有必要使用显式类型的局部变量,但我只是希望类型清晰。

答案 1 :(得分:1)

您可以将w+分组到这样的(w+)组中,然后当您检索匹配的字符串时,您可能会要求该子组。

我不知道我是不是错了(但你没有提供任何代码)但我认为这是如何完成的:.Groups[1].ValueRegex.Match的结果。

答案 2 :(得分:1)

下面的正则表达式如何?它的工作原理是将第一个字符捕获到一个命名组中,然后将任何重复捕获到一个名为第一组的命名组中,然后将其用于匹配字符串的结尾。它可以与任意数量的重复字符一起使用,只要它们在单词的最后重复即可。

'(?<first_group>(?<first_char>.)\k<first_char>+)(?<word>\w+)\k<first_group>+'

您只需要提取名为word的捕获组,如下所示:

String sample = "$$My_Name$$";
Regex regex = new Regex("(?<first_group>(?<first_char>.)\k<first_char>+)(?<word>\w+)\k<first_group>+");

Match match = regex.Match(sample);

if (match.Success)
{
    Console.WriteLine(match.Groups["word"].Value);
}

答案 3 :(得分:0)

您可以像这样使用命名组:

(\$\$)(?<group1>.+?)\1      -- pattern 1  (first  case)
\[(#)(?<group2>.+?)\1\]     -- pattern 2  (second case)

或组合表示将是:

(\$\$)(?<group1>.+?)\1|\[(#)(?<group2>.+?)\3\]

我建议您使用.+?它可以帮助您匹配除前缀/后缀之外的任何字符。

Live Demo