Замените заглавную строку на Pascal Case, используя Regex

Как заменить строку, состоящую из заглавных букв, соответствующей версией в паскале? Например, если у меня есть эти строки:

SOMETHING_COOL SOMETHING_LESS_COOL ЧТО-ТО

Я хочу этот вывод:

Что-то крутое Что-то менее крутое

Я зашел так далеко с регулярным выражением:

^*public\s[\w-]+?(\?)?\s[A-Z]+?(_[A-Z]+)?(_[A-Z]+)? { get; set; }

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

РЕДАКТИРОВАТЬ: я буду использовать .NET/С# для просмотра файлов


person Noel    schedule 20.06.2013    source источник
comment
Какой язык или инструмент вы используете?   -  person Andrew Clark    schedule 21.06.2013
comment
Откуда вы берете эти строки? Файл? Пользовательский ввод?   -  person Dour High Arch    schedule 21.06.2013
comment
@F.J выглядит как C#, с которым он пытается сопоставиться, так что, вероятно, это для регулярного выражения   -  person Keith Nicholas    schedule 21.06.2013
comment
Я отредактировал описание, чтобы ответить на ваши вопросы.   -  person Noel    schedule 21.06.2013


Ответы (2)


для паскального регистра идентификатора после того, как вы его сопоставили, вы можете использовать другое регулярное выражение.

Я изменил ваше исходное регулярное выражение, поэтому оно использует просмотр вперед и назад, чтобы захватить только идентификатор как совпадение

Этот код берет некоторый код C# с вашей необычной схемой именования и заменяет его кодом с регистром pascal:

var code = "public class Blah\r\n   public int SOMETHING_LESS_COOL { get; set; }\r\n }";
var identifierRegex = new Regex(@"(?<=^\s*public\s[\w-]+?(\?)?\s)[A-Z]+(_[A-Z]+)*(?=\s*\{\s*get;\s*set;\s*\})", RegexOptions.Multiline);           
var underscoreRegex = new Regex(@"(_|\s|^)\w");           
var pascalCode = identifierRegex.Replace(code, 
       i => underscoreRegex.Replace(i.Value.ToLower(),
                          m => m.Value.ToUpper().Replace("_",""))); 

Хотя это изменит объявления, оно не заменит код, использующий эти свойства. Таким образом, у вас останется приличная работа по очистке. Может быть интересно посмотреть, сможете ли вы написать скрипт Visual Studio для рефакторинга «Переименовать».

person Keith Nicholas    schedule 20.06.2013
comment
Если вы используете var, то вы используете встроенный код. Если вы используете встроенный код, вам, вероятно, не следует использовать RegexOptions.Compiled. Посмотрите этот этот вопрос и ответ для некоторых показателей производительности. - person Scott Chamberlain; 21.06.2013
comment
@ScottChamberlain уверен, но если он встроит это в класс, я бы скорее ожидал, что регулярные выражения будут настроены заранее, а затем он будет перебирать свои файлы, выполняя замены ... - person Keith Nicholas; 21.06.2013
comment
@ScottChamberlain взял их для фрагмента... помогает немного уменьшить беспорядок в коде! - person Keith Nicholas; 21.06.2013

Имея идентификатор в строковой переменной, попробуйте следующее:

var parts = identifier.Split('_');
var pascalCasedParts = parts.Select(p => p[0] +
                           new string(p.ToLower().Skip(1).ToArray()));
var pascalIdent = string.Join("", pascalCasedParts.ToArray());
person Vlad    schedule 20.06.2013