Я создаю компонент форматирования текста .NET, который использует список настраиваемых регулярных выражений для преобразования входного текста. Мне также нужно разрешить преобразование регистра с использованием правил регулярных выражений, но я не могу понять, как это сделать в .NET. Выражение замены в стиле Perl, такое как s/(\b)([a-z])/\1\u\2/g, поможет, но .NET, похоже, не поддерживает его. Я знаю, что могу использовать MatchEvaluator с делегатом, но мне нужно, чтобы мои правила замены можно было настраивать (текст).

Любая помощь была бы признательна.

3
remy 8 Апр 2011 в 00:43

1 ответ

Самый .NET-стиль был бы

 var regex = new Regex(@"^(?<first>.*?):(?<second>.*)$", RegexOptions.Compiled);
 Console.WriteLine(regex.Replace("moon:glow", "${second}:${first}"));

Напечатаю

 glow:moon

Вы также можете использовать порядковые ссылки, например:

 Console.WriteLine(regex.Replace("moon:glow", "$2:$1"));

Смешивать их нормально.

В отличие от Perl, вы можете индивидуально получить все совпадающие значения для повторяющихся атомов, например, например:

var regex = new Regex(@"^((?<token>.*?):)*", RegexOptions.Compiled);
foreach (Capture token in regex
         .Match("moon:glow:is:the most:beautiful:thing")
         .Groups["token"].Captures)
     Console.WriteLine(token.Value);

Выход

moon
glow
is
the most
beautiful

Чтобы получить сложную оценку соответствия, вы должны сделать, например.

var upper = Regex.Replace("moon:glow:is:the most:beautiful:thing", "(.*?)(:|$)",                  
    m => m.Groups[1].Value.ToUpper() + m.Groups[2]);
Console.WriteLine(upper);

К сожалению, я не вижу простого способа настроить такую ​​функцию оценки только как текст (за исключением случаев использования компилятора в качестве службы, которая, как я знаю, доступна в Mono, но я еще не совсем уверен в MS .Net)

3
sehe 8 Апр 2011 в 01:09
Как OP должен перевести это в общий способ принять определяемое пользователем определение замены в своем приложении. Ваш пример делает переключатель. Его пример изменяет случай.
 – 
Simen S
8 Апр 2011 в 00:57
+1 Как и OP, и вы, я не думаю, что просто предоставить пользовательский интерфейс для общей спецификации замены, которая будет выполняться C # RegEx.
 – 
Simen S
8 Апр 2011 в 01:30
Возможно, я был неясен в своем первоначальном сообщении. Я знаю, как использовать регулярные выражения в .NET; Я хотел бы знать, как сделать преобразование регистра с параметром замены. В Perl это можно сделать, но в .NET кажется, что вы не можете использовать какую-либо логику в замещающем значении.
 – 
remy
8 Апр 2011 в 02:32
can't do any logic может быть просто слишком резким, но да, преобразование регистра не может быть сделано
 – 
sehe
8 Апр 2011 в 02:53