Как я могу использовать вычисленное значение в операции замены RegEx в C #? - PullRequest
9 голосов
/ 10 августа 2009

Я ищу способ использования длины группы совпадений в выражении замены с помощью функции c # regex.replace.

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

Пример:

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", "${exes} - ???");

Желаемый выход

X - 3

Примечание: Это чрезвычайно надуманный / упрощенный пример для демонстрации вопроса. Я понимаю, что для этого примера регулярное выражение не идеальный способ сделать это. Просто поверьте мне, что применение ответа в реальном мире является частью более сложной проблемы, которая требует использования замены RegEx здесь.

Ответы [ 3 ]

13 голосов
/ 10 августа 2009

Если вы используете C # 3, вы можете просто создать MatchEvaluator из лямбда-выражения:

string val = Regex.Replace(
   "xxx",
   @"(?<exes>x{1,6})",
   new MatchEvaluator(
      m => m.Groups["exes"].Value[0] + " - " + m.Groups["exes"].Value.Length.ToString()
   )
);

В C # 2 вы можете использовать делегата:

string val = Regex.Replace(
   "xxx",
   @"(?<exes>x{1,6})",
   new MatchEvaluator(
      delegate(Match m) {
         return m.Groups["exes"].Value[0] + " - " + m.Groups["exes"].Value.Length.ToString();
      }
   )
);
9 голосов
/ 10 августа 2009

Попробуйте использовать версию Regex.Replace, которая вызывает функцию, чтобы определить, каким должен быть текст замены:

public string Replace(string, MatchEvaluator);

http://msdn.microsoft.com/en-us/library/aa332127(VS.71).aspx

Затем функция может просмотреть сопоставленный текст (объект Match предоставляется в качестве аргумента функции оценки) и вернуть строку с правильным вычисленным значением.

3 голосов
/ 10 августа 2009

Попробуйте

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", new MatchEvaluator(ComputeReplacement));

с примером MatchEvaluator ниже

public String ComputeReplacement(Match matchResult) {
  return matchResult.Value.Length.ToString();
}

(частично украдено из книги рецептов регулярных выражений - моя библия хаха)

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