Что такое C # Regex, эквивалентный Java appendReplacement и appendTail - PullRequest
5 голосов
/ 24 сентября 2010

UPDATE

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

Вы видите что-нибудь неуместное?

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. Он сохраняет первоначально замененный текст, потому что его необходимо вставить позже после завершения сжатия некоторых пробелов.

Ответы [ 2 ]

5 голосов
/ 25 сентября 2010

Нет необходимости воспроизводить функциональность Java appendReplacement/appendTail; В .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, которые подробно обсуждаются в этой статье . Этот (лямбда-выражения), безусловно, самый крутой.

2 голосов
/ 24 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...