0

私は文字列を持っていますが<link rid="bib*">222</link><link rid="fig1">333</link> 今、上記のテキストのすべての出現をrid="bib*" に<CITATION id="CD1">222</CITATION>置き換え、テキストのすべての出現をrid="fig*"に置き換えたいと思います<FigRef id="fig*">222</FigRef>

私はこのようなことを試しました

var reg = new Regex(@"\<link rid=""bib(?<myText>.+?)""\>(?<myText2>.+?)\</link\>$");

しかし、これを進める方法がわからず、行き詰まりました。これで私を助けてください。

4

2 に答える 2

0

非常によく似た正規表現に基づくソリューションを次に示します。

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;
}
于 2013-05-27T14:08:00.880 に答える