2013-05-27 54 views
0

我在與<link rid="bib*">222</link><link rid="fig1">333</link> 現在我想一個字符串替換擺脫=「圍脖*」上面的文字中所有的次數,以<CITATION id="CD1">222</CITATION>和替換所有用rid =「fig *」出現的文本,用<FigRef id="fig*">222</FigRef>正則表達式匹配特定類型的字符串和替換

我想是這樣的

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

,但我不知道如何與這個出發,卡住了。 請幫我這個。

+0

你能否提供一個解決的例子? – NeverHopeless

回答

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; 
} 
0

感謝您的答覆傢伙。最後,我爲自己的問題找到了解決方案。現在我得到了解決問題的方案。我像這樣解決了它。

public enum intLinks 
    { 
     bib = 1, 
     fig = 2, 
     tab=3, 
     tb=4 
    } 

這是爲了替換與匹配圖案中的內容的方法。

public string NumberedReplaceTest(string input, intLinks refToFind) 
    { 
     //"<link rid=\"bib1\">1</link>" 
     Regex regex = new Regex(@"<link rid=""" + refToFind.ToString() + @"(?<sequence>\d*)"">(\r?\n)*(?<number>[a-zA-Z0-9]*)(\r?\n)*</link>"); 
     if (!regex.IsMatch(input)) 
      return input; 

     switch (refToFind) 
     { 
      case intLinks.bib: return regex.Replace(input, "<Citation CID=\"CR${sequence}\">${number}</Citation>"); 
      case intLinks.fig: return regex.Replace(input, "<InternalRef RefID=\"Fig${sequence}\">${number}</InternalRef>"); 
      case intLinks.tab: return regex.Replace(input, "<InternalRef RefID=\"Tab${sequence}\">${number}</InternalRef>"); 
      case intLinks.tb: return regex.Replace(input, "<InternalRef RefID=\"Tab${sequence}\">${number}</InternalRef>"); 
      default: return input; 
     }    

    } 

我打電話這樣的方法。

 bodyString = NumberedReplaceTest(bodyString,intLinks.bib); 
     bodyString = NumberedReplaceTest(bodyString, intLinks.fig); 
     bodyString = NumberedReplaceTest(bodyString, intLinks.tab); 
     bodyString = NumberedReplaceTest(bodyString, intLinks.tb);` 
相關問題