非常によく似た正規表現に基づくソリューションを次に示します。
private const string REGEX_LINK = @"<link\s+rid=""([^""\d]+)(\d+)"">(.*?)</link>";
private const int REGEX_LINK_GRP_RID_NAME = 1;
private const int REGEX_LINK_GRP_RID_ID = 2;
private const int REGEX_LINK_GRP_VALUE = 3;
static void Main(string[] args)
{
var testInputString = "I'm having a string with <link rid=\"bib123\">222</link> and <link rid=\"fig456\">333</link> now i want to replace all the occurances...";
Regex linkFinder = new Regex(REGEX_LINK, RegexOptions.IgnoreCase);
var result = linkFinder.Replace(testInputString, new MatchEvaluator(LinkMatchEvaluator));
Console.WriteLine(result);
Console.ReadKey();
}
private static string LinkMatchEvaluator(Match m)
{
const string CITATION_RID_NAME = "bib";
const string FIGREF_RID_NAME = "fig";
var ridName = m.Groups[REGEX_LINK_GRP_RID_NAME].Value.ToLower();
var ridID = m.Groups[REGEX_LINK_GRP_RID_ID].Value;
var value = m.Groups[REGEX_LINK_GRP_VALUE].Value;
if (ridName == CITATION_RID_NAME)
{
return String.Format("<CITATION id=\"CD{0}\">{1}</CITATION>", ridID, value);
}
else if (ridName == FIGREF_RID_NAME)
{
return String.Format("<FigRef id=\"fig{0}\">{1}</FigRef>", ridID, value);
}
return m.Value;
}