0

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

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

我在 C# 代码中提取匹配项,以便可以使用它们,但显然我的匹配项包含$$My_Name$$但我想要的是简单地获取 Suffix 和 Prefix: 之间的内部字符串My_Name

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

4

4 回答 4

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"

PS - 不需要使用显式类型的局部变量,但我只是希望类型清晰。

于 2013-09-03T11:10:23.683 回答
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);
}
于 2013-09-03T11:40:09.940 回答
1

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

我不知道我是否错了(但你没有提供任何代码)但我认为它是这样做的:.Groups[1].ValueRegex.Match.

于 2013-09-03T11:11:37.797 回答
0

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

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

或组合表示将是:

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

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

现场演示

于 2013-09-03T14:28:37.130 回答