2017-04-26 3 views
2

Ich habe eine Zeichenfolge getaggten Inhalten mit ähnlichen Mustern enthält wie unten:Wie extrahiert man mehrere Teilstrings aus C# String?

This is a <ss type="">(example)</ss> string which <ss type="">(contains)</ss> tagged contents. 

Erwartetes Ergebnis ist:

This is a <ss type="example">(example)</ss> string which <ss type="contains">(contains)</ss> tagged contents. 

Ich habe versucht, durch RegularExpression Liste von markierten Inhalten zu extrahieren und extrahiert haben, die Liste der Tag-Texte, und setzen Sie den Tag-Text in den Anführungszeichen als Wert von type, und ersetzt die neue Zeichenfolge durch die alte.

Aber das Problem ist, da die Regex.Replace(); wird nach dem gleichen Regex Muster, es werden alle getaggten Inhalten mit dem letzten Element des Tags Inhalte ersetzt Liste wie unten:

This is a <ss type="contains">(contains)</ss> string which <ss type="contains">(contains)</ss> tagged contents. 

Mein Arbeits Code ist unten :

StringBuilder resultText= new StringBuilder(@"This is a <ss type="">(example)</ss> string which <ss type="">(contains)</ss> tagged contents."); 
string overallPattern = @"<ss\stype=""([a-zA-Z]*)"">(.*?)</ss>"; 
List<string> matchList = new List<string>(); 
List<string> contentList = new List<string>(); 
StringBuilder sb; 
Regex overallRegex = new Regex(overallPattern, RegexOptions.None); 
string resultContent = resultText.ToString(); 
foreach (Match match in overallRegex.Matches(resultContent)) 
    { 
     string matchResult = match.ToString(); 
     matchList.Add(matchResult); 
     string content = matchResult.Split('(', ')')[1]; 
     contentList.Add(content); 
    } 
for (int j = 0; j < matchList.Count; j++) 
    { 
     sb = new StringBuilder(); 
     sb.Append(matchList[j].Insert(10, string.Format(contentList[j]))); 
     resultContent = Regex.Replace(resultContent, overallPattern, sb.ToString()); 
     resultText = new StringBuilder(); 
     resultText.Append(resultContent); 
    } 

Meine Frage ist:

Wie kann ich den richtigen Tag-Text in sein Doppelzitat nach Auftrag eingeben?

+0

Haben Sie Ihren RegexMuster geprüft Wie ich es sehe ist nichts passende –

+0

Ok der Grund Dies ist ein die Muss sein Dies ist ein . Ich habe Ihre Frage bereits bearbeitet –

+0

@ S.Petrosov Danke für Ihre Mühe. Es passt. Tatsächlich kommt die Saite von woanders mit Double-Quote-Escapes wie '\". Ich denke, es ist dasselbe wie deins. Die obige Saite dient nur zur Demonstration. –

Antwort

2

Sie haben dynamisch für replaceRegex basierend auf Tag-Inhalt zu erstellen. Zum Beispiel <ss\stype="([a-zA-Z]*)">\(example\)<\/ss> ersetzt nur einen Tag mit example im Inhalt. Bitte überprüfen Sie dies, es wird nach Ihrer Beschreibung arbeiten.

Code:

//StringBuilder resultText = new StringBuilder(@"This is a <ss type="""">(example)</ss> string which <ss type="""">(contains)</ss> tagged contents."); 
//You have to use """" instead on "" in this line 
StringBuilder resultText = new StringBuilder(@"This is a <ss type="""">(example)</ss> string which <ss type="""">(contains)</ss> tagged contents."); 
string overallPattern = @"<ss\stype=""([a-zA-Z]*)"">(.*?)</ss>"; 
List<string> matchList = new List<string>(); 
List<string> contentList = new List<string>(); 
StringBuilder sb; 
Regex overallRegex = new Regex(overallPattern, RegexOptions.None); 
string resultContent = resultText.ToString(); 
foreach (Match match in overallRegex.Matches(resultContent)) 
{ 
    string matchResult = match.ToString(); 
    matchList.Add(matchResult); 
    string content = matchResult.Split('(', ')')[1]; 
    contentList.Add(content); 
} 
for (int j = 0; j < matchList.Count; j++) 
{ 
    //Dynamic Regex based on tag content for replace 
    overallPattern = @"<ss\stype=""([a-zA-Z]*)"">\("+ contentList[j] + "\\)</ss>"; 
    sb = new StringBuilder(); 
    sb.Append(matchList[j].Insert(10, string.Format(contentList[j]))); 
    resultContent = Regex.Replace(resultContent, overallPattern, sb.ToString()); 
    resultText = new StringBuilder(); 
    resultText.Append(resultContent); 
} 

Ausgabe von oben Code:

This is a <ss type="example">(example)</ss> string which <ss type="contains">(contains)</ss> tagged contents.

+0

Yay! Es funktioniert! Ich bin nicht vertraut mit Regex, der dynamische Teil ist genau dort, wo ich war verwirrend. Eigentlich war ich fast da. Danke! –

0

Sie müssen nur

resultContent = Regex.Replace(resultContent, overallPattern, sb.ToString()); 

Durch diese ersetzen:

resultContent = resultContent.Replace(matchList[j], sb.ToString()); 
+0

Danke für deine Mühe. Ich habe diesen Teil gemacht. Aber was du geschrieben hast ist nicht Genau das, was ich wollte –

Verwandte Themen