2010-09-24 1 views
5

UPDATEЧто такое C# Regex эквивалент в Java appendReplacement и appendTail

Вот что я придумал. Я еще не тестировал его, потому что он является частью гораздо большего фрагмента кода, который по-прежнему нужно портировать.

Вы не видите ничего, что выглядит неуместным?

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

ОРИГИНАЛЬНЫЙ ПОСТ НИЖЕ:

Вот оригинал 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(); 

И мой C# преобразования до сих пор

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

См. Комментарий выше, где я спрашиваю: «ЧТО ДЕЛАТЬ ЗДЕСЬ?»

Разъяснение
Java-код выше выполняет замену строки на некотором HTML. Он сохраняет первоначально замененный текст, потому что его необходимо повторно вставить позже после завершения некоторого сжатия пробела.

+1

Так в чем проблема? – erickson

+2

Можете ли вы лучше определить проблему, например, каков ожидаемый результат и какой результат вы получаете? – CodingGorilla

+5

Я предполагаю, что его части обозначены буквой '// ЧТО Я ДЕЛАТЬ ЗДЕСЬ?' – jrummell

ответ

5

Там нет необходимости воспроизводить appendReplacement/appendTail функциональность в Java; .NET имеет что-то лучшее: MatchEvaluator. Проверьте это:

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

выход:

Element 0 = 111 Element 1 = 222 XYZ 
111 
222 

Есть несколько способов реализации в MatchEvaluator, все тщательно обсуждается в this article. Этот (лямбда-выражения), безусловно, самый крутой.

+1

Я проверю это утром. +1 для программирования на основе «прохлады». –

+1

Отлично. Это работало очень хорошо. Спасибо. –

2

Я не знаком с классами регулярных выражений Java, но это мой C# интерпретация того, что я думаю, что делает ваш код:

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

Удивительно, это почти то, что я придумал! Вы помещаете m.Index + m.Length в нужное место. Благодарю. Я дам вам знать, как это работает. –

+1

Работает отлично. Благодаря! –

Смежные вопросы