2010-09-24 16 views
5

UPDATECo to jest równoważne C# regex Java appendReplacement i appendTail

Oto co wymyśliłem. Nie testowałem jeszcze tego, ponieważ jest częścią znacznie większego fragmentu kodu, który wciąż wymaga przeniesienia.

Czy widzisz coś, co wygląda na nie na miejscu?

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(); 

oryginalny post poniżej:

Oto oryginalna 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(); 

A mój C# konwersji dotychczas

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(); 

Patrz komentarz powyżej, gdzie pytam: "CO ROBIĘ TUTAJ?"

Wyjaśnienie
kod Java powyżej dokonywaniu wymiany strun na niektóre HTML. Zapisuje pierwotnie zamieniony tekst, ponieważ musi zostać ponownie wstawiony później po zakończeniu kompresji białych znaków.

+1

Więc w czym problem? – erickson

+2

Czy możesz lepiej zdefiniować problem, na przykład jaki jest oczekiwany wynik i jaki jest wynik, jaki otrzymujesz? – CodingGorilla

+5

Zgaduję, że są to części oznaczone "// CO ROBIĘ TUTAJ?" – jrummell

Odpowiedz

5

Nie ma potrzeby, aby odtworzyć appendReplacement/appendTail funkcjonalności Javy; .NET ma coś lepszego: MatchEvaluator. Sprawdź:

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

wyjściowa:

Element 0 = 111 Element 1 = 222 XYZ 
111 
222 

Istnieje kilka sposobów wdrażania MatchEvaluator, wszystko dokładnie omówione w this article. Ten (wyrażenia lambda) jest zdecydowanie najfajniejszy.

+1

Sprawdzę to rano. +1 dla programowania w oparciu o "chłód". –

+1

Doskonały. To działało bardzo dobrze. Dziękuję Ci. –

2

nie jestem zaznajomiony z klas regex Java, ale to jest moja interpretacja C# co myślę kod robi:

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

niesamowite, to prawie dokładnie to, co wymyśliłem! Wstawiasz m.Index + m.Length w odpowiednim miejscu. Dzięki. Dam ci znać, jak to działa trochę. –

+1

Działa idealnie. Dzięki! –