2010-09-24 11 views
5

UPDATEBurada ile geldi ne Java'nın appendReplacement ve appendTail

C# Regex eşdeğer nedir. Henüz test etmedim, çünkü hala taşınması gereken çok daha büyük bir kod parçasının bir parçası.

Yere bakan bir şey görebiliyor musunuz?

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

AŞAĞIDA ORİJİNAL POST: Burada

orijinal Java geçerli:

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

Ve C# dönüşüm bugüne kadar

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

Yukarıdaki yoruma bakın, "NELER YAPABİLİRİM?"

Açıklama
yukarıda bazı HTML dize değiştirme performans Java kodu. Özgün olarak değiştirilen metni kaydeder, çünkü bazı boşluk sıkıştırması tamamlandıktan sonra yeniden eklenmelidir.

+1

Peki sorun nedir? – erickson

+2

Sorunu daha iyi tanımlayabilir misiniz, beklenen sonuç nedir ve elde ettiğiniz sonuç nedir? – CodingGorilla

+5

"// NE BURADA NE YAPABİLİRİM?" Ile işaretlenmiş parçaların tahminini yapıyordum? – jrummell

cevap

5

Java'nın appendReplacement/appendTail işlevselliğini çoğaltmak gerek yoktur; .NET'in daha iyi bir şeye sahip olması: MatchEvaluator. Şuna göz atın:

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

çıkışı:

Element 0 = 111 Element 1 = 222 XYZ 
111 
222 

MatchEvaluator, bütün iyice this article tartışılan uygulamak için çeşitli yollar vardır. Bu (lambda ifadeleri) çok havalı.

+1

Sabah kontrol edeceğim. "Serinlik" temelli programlama için +1. –

+1

Mükemmel. Bu çok iyi çalıştı. Teşekkür ederim. –

2

Java regex sınıfları aşina değilim, ama bu senin kod yapar ne düşündüğünü benim C# yorumudur:

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

harika, bu tam olarak neyle geldiğini gösteriyor! M.Index + m.Length'u doğru yere koyun. Teşekkürler. Biraz nasıl performans gösterdiğini size bildiririm. –

+1

Mükemmel çalışıyor. Teşekkürler! –