我有一个正则表达式,它使用前缀和后缀搜索字符串。最简单的格式\$\$\w+\$\$
会找到$$My_Name$$
(在这种情况下,前缀和后缀都等于$$
)另一个例子是\[\#\w+\#\]
来匹配[#My_Name#]
Prefix和Suffix将始终是一个0到n个字符的特定字符串,我总是可以安全地转义它以进行直接的字符匹配。
我在C#代码中提取了匹配,因此我可以使用它们,但显然我的匹配包含$$My_Name$$
但我想要的只是获取后缀和前缀之间的内部字符串:My_Name
。
如何从结果中排除前缀和后缀?
答案 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].Value
对Regex.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\]
我建议您使用.+?
它可以帮助您匹配除前缀/后缀之外的任何字符。