2010-09-24 10 views
5

UPDATEWas ist der C# Regex entspricht Java appendReplacement und appendTail

Hier ist, was ich kam mit. Ich habe es noch nicht getestet, weil es Teil eines viel größeren Teils des Codes ist, der noch portiert werden muss.

Können Sie etwas sehen, das fehl am Platz erscheint?

private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new ArrayList(); 

MatchCollection matcher = preservePatterns[p].Matches(html); 
int index = 0; 
StringBuilder sb = new StringBuilder(); 
int lastValue = 0; 

foreach(Match match in matcher){ 
    string matchValue = match.Groups[0].Value; 

    if(matchValue.Trim().Length > 0) { 
     userBlock.Add(matchValue); 

     int curIndex = lastValue + match.Index; 
     sb.Append(html.Substring(lastValue, curIndex)); 
     sb.AppendFormat(tempUserBlock, p, index++); 

     lastValue = curIndex + match.Length; 
    } 
} 

sb.Append(html.Substring(lastValue)); 
html = sb.ToString(); 

ORIGINAL POST UNTEN:

Hier ist die ursprüngliche Java:

private static final String tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
String html = "some html"; 
int p = 0; 
List<String> userBlock = new ArrayList<String>(); 

Matcher matcher = patternToMatch.matcher(html); 
int index = 0; 
StringBuffer sb = new StringBuffer(); 
while (matcher.find()) 
{ 
    if (matcher.group(0).trim().length() > 0) 
    { 
     userBlock.add(matcher.group(0)); 
     matcher.appendReplacement(sb, MessageFormat.format(tempUserBlock, p, index++)); 
    } 
} 
matcher.appendTail(sb); 
html = sb.toString(); 

Und meine C# Umwandlung bisher

private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new ArrayList(); 

MatchCollection matcher = preservePattern.Matches(html); 
int index = 0; 
StringBuilder sb = new StringBuilder(); 

for(var i = 0; i < matcher.Count; ++i){ 
    string match = matcher[i].Groups[0].Value; 
    if(match.Trim().Length > 0) { 
     userBlock.Add(match); 
     // WHAT DO I DO HERE? 
     sb.Append(string.Format(tempUserBlock, p, index++));    
    } 
} 
// WHAT DO I DO HERE? 
matcher.appendTail(sb); 
html = sb.toString(); 

Siehe Kommentar oben, wo ich frage: "Was mache ich hier?"

Klärung
Der Java-Code oben auf einige HTML-String Ersatz ausführt. Er speichert den ursprünglich ersetzten Text, da er später erneut eingefügt werden muss, nachdem die Weißraumkomprimierung abgeschlossen ist.

+1

Also, was ist das Problem? – erickson

+2

Können Sie das Problem besser definieren, wie ist das erwartete Ergebnis und was ist das Ergebnis, das Sie erhalten? – CodingGorilla

+5

Ich vermute es sind die Teile, die mit '// WAS MACHT ICH HIER?' – jrummell

Antwort

5

Es gibt keine Notwendigkeit Javas appendReplacement/appendTail Funktionalität zu reproduzieren; .NET hat etwas besseres: MatchEvaluator. Check it out:

string holder = "Element {0} = {1}"; 
string s0 = "111 222 XYZ"; 
ArrayList arr = new ArrayList(); 

string s1 = Regex.Replace(s0, @"\d+", 
    m => string.Format(holder, arr.Add(m.Value), m.Value) 
); 

Console.WriteLine(s1); 
foreach (string s in arr) 
{ 
    Console.WriteLine(s); 
} 

Ausgang:

Element 0 = 111 Element 1 = 222 XYZ 
111 
222 

Es gibt mehrere Möglichkeiten, um die MatchEvaluator, alle gründlich diskutiert in this article umzusetzen. Dieser (Lambda-Ausdrücke) ist bei weitem der coolste.

+1

Ich überprüfe es am Morgen. +1 für die Programmierung basierend auf "Coolness". –

+1

Ausgezeichnet. Das hat sehr gut funktioniert. Vielen Dank. –

2

Ich bin nicht vertraut mit den Java Regex-Klassen, aber das ist meine C# Interpretation dessen, was ich denke, Ihr Code tut:

private const string tempUserBlock = "%%%COMPRESS~USER{0}~{1}%%%"; 
string html = "some html"; 
int p = 0; 
var userBlock = new List<string>(); 

MatchCollection matcher = preservePattern.Matches(html); 
StringBuilder sb = new StringBuilder(); 
int last = 0; 
foreach (Match m in matcher) 
{ 
    string match = m.Groups[0].Value; 
    if(match.Trim().Length > 0) { 
     userBlock.Add(match); 
     sb.Append(html.Substring(last, m.Index - last)); 
     sb.Append(m.Result(string.Format(tempUserBlock, p, index++))); 
    } 
    last = m.Index + m.Length; 
} 
sb.Append(html.Substring(last)); 
html = sb.ToString(); 
+1

genial, das ist fast genau das, was mir einfällt! Du legst den m.Index + m.Length an die richtige Stelle. Vielen Dank. Ich werde Sie wissen lassen, wie es in einem Stück funktioniert. –

+1

Funktioniert perfekt. Vielen Dank! –