Разделение CamelCase с помощью регулярного выражения

У меня есть этот код для разделения CamelCase по регулярному выражению:

Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled).Trim();

Однако он не разделяет это правильно: ShowXYZColours

Он производит Show XYZColours вместо Show XYZ Colours

Как мне получить желаемый результат?


person Sean    schedule 24.01.2014    source источник


Ответы (4)


С поддержкой Unicode

(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})

Авария:

(?=               # look-ahead: a position followed by...
  \p{Lu}\p{Ll}    #   an uppercase and a lowercase
)                 #
|                 # or
(?<=              # look-behind: a position after...
  \p{Ll}          #   an uppercase
)                 #
(?=               # look-ahead: a position followed by...
  \p{Lu}          #   a lowercase
)                 #

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


РЕДАКТИРОВАТЬ: Конечно, вы можете заменить \p{Lu} на [A-Z] и \p{Ll} на [a-z], если это то, что вам нужно, или ваш механизм регулярных выражений не понимает категории Unicode.

person Tomalak    schedule 24.01.2014

.NET DEMO

Вы можете использовать что-то вроде этого:

(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])

КОД:

string strRegex = @"(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"ShowXYZColours";
string strReplace = @" $1$2";

return myRegex.Replace(strTargetString, strReplace);

ВЫВОД :

Show XYZ Colours

Демонстрация и объяснение

person Sujith PS    schedule 24.01.2014
comment
Это теряет Co в цветах - person Sean; 24.01.2014
comment
Спасибо, что напомнили :), я обновил свой ответ. - person Sujith PS; 24.01.2014

использование регулярного выражения Tomalak с .NET System.Text.RegularExpressions создает пустую запись в позиции 0 результирующего массива:

Regex.Split("ShowXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})")

{string[4]}
    [0]: ""
    [1]: "Show"
    [2]: "XYZ"
    [3]: "Colors"

Однако он работает для caMelCase (в отличие от PascalCase):

Regex.Split("showXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})")

{string[3]}
    [0]: "show"
    [1]: "XYZ"
    [2]: "Colors"
person dr. rAI    schedule 19.03.2014

Вы можете попробовать следующее:

Regex.Replace(input, "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();

Пример:

Regex.Replace("TheCapitalOfTheUAEIsAbuDhabi", "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();

Вывод: столица ОАЭ - Абу-Даби.

person Husam Ebish    schedule 03.07.2018