我有一个正则表达式,用于提取文件夹名称的两个部分:
([0-9]{8})_([0-9A-Ba-c]+)_BLAH
没问题。这将匹配12345678_abc_BLAH - 我有两组“12345678”和“abc”。
是否可以通过提供带有两个字符串的方法并将它们插入到模式的组中来构造文件夹名称?
public string ConstructFolderName(string firstGroup, string secondGroup, string pattern)
{
//Return firstGroup_secondGroup_BLAH
}
使用相同的模式提取组和构造字符串会更易于管理。
答案 0 :(得分:3)
答案 1 :(得分:2)
如果你知道你的正则表达式将总是有两个捕获组,那么你可以正则表达正则表达式,可以这么说。
private Regex captures = new Regex(@"\(.+?\)");
public string ConstructFolderName(string firstGroup, string secondGroup, string pattern)
{
MatchCollection matches = captures.Matches(pattern);
return pattern.Replace(matches[0].Value, firstGroup).Replace(matches[1].Value, secondGroup);
}
显然,这没有任何错误检查,并且可能使用String.Replace之外的其他方法更好地完成;但是,这肯定有效,应该给你一些想法。
编辑:显而易见的改进是在构建它们之前实际使用该模式验证firstGroup
和secondGroup
字符串。 MatchCollection
的0和1项可以创建自己的正则表达式并在那里执行匹配。如果你愿意,我可以补充一下。
EDIT2 :以下是我所说的验证:
private Regex captures = new Regex(@"\(.+?\)");
public string ConstructFolderName(string firstGroup, string secondGroup, string pattern)
{
MatchCollection matches = captures.Matches(pattern);
Regex firstCapture = new Regex(matches[0].Value);
if (!firstCapture.IsMatch(firstGroup))
throw new FormatException("firstGroup");
Regex secondCapture = new Regex(matches[1].Value);
if (!secondCapture.IsMatch(secondGroup))
throw new FormatException("secondGroup");
return pattern.Replace(firstCapture.ToString(), firstGroup).Replace(secondCapture.ToString(), secondGroup);
}
另外,我可以补充一点,您可以将第二个捕获组更改为([0-9ABa-c]+)
,因为A到B实际上不是一个范围。