2014-10-04 3 views
-1

Я пытался получить команду # регулярное выражение C, чтобы включить что-то вродеC# String - Сплит Pascal Case

EYDLessThan5Days 

в

EYD Less Than 5 Days 

Любые идеи?

Код я использовал:

public static string SplitPascalCase(this string value) { 
    Regex NameExpression = new Regex("([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z0-9]+)", 
            RegexOptions.Compiled); 
    return NameExpression.Replace(value, " $1").Trim(); 
} 

Out:

EYD Less Than5 Days 

Но все-таки дать мне неправильный результат.

На самом деле, я уже спрашивал об этом в javascript-коде, но когда я реализовал код C# с такой же логикой, это не удалось.

Пожалуйста, помогите мне. Благодарю.

+0

я думаю, что он не хочу отделяться 5. –

+0

Я не совсем уверен, о чем вы просите - вам был дан очень подробный ответ в http://stackoverflow.com/questi ons/26188882/split-pascal-case-in-javascript-some-case, вместо того, чтобы напрямую преобразовывать его в C#, вы несколько случайно объединили части и теперь ищете какую-то помощь. Я рекомендую вам выполнить прямое преобразование и попросить «как объединить следующее регулярное выражение» (если вы не смогли сделать это самостоятельно). Также подумайте о том, чтобы сохранить качество образца кода, сравнимого с одним в этом ответе, - регулярные выражения без комментариев в основном нечитаемы. –

+0

Его так же просто удалить любую ссылку на [0-9] и поставить ее в отдельное чередование. См. @AmitJoki regex '([AZ] + (? = $ | [AZ] [az]) | [AZ]? [Az] + | [0-9] +)' – sln

ответ

1

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

(?<=[A-Za-z])(?=[A-Z][a-z])|(?<=[a-z0-9])(?=[0-9]?[A-Z]) 

Заменить согласованные границы пробелом.

Regex.Replace(yourString, @"(?<=[A-Za-z])(?=[A-Z][a-z])|(?<=[a-z0-9])(?=[0-9]?[A-Z])", " "); 

DEMO

Объяснение:

  • (?<=[A-Za-z])(?=[A-Z][a-z]) Спички граница, которая была существует между ними верхней или строчной буквы и прописной буквы, которые сразу следуют буквы нижнего регистра. Например. рассмотрим эту строку ABc. И это регулярное выражение будет соответствовать, граница существует между A и Bc. Для этого aBc например, это регулярное выражение будет соответствовать, граница существует между ними a и Bc

  • | логический оператор ИЛИ.

  • (?<=[a-z0-9])(?=[0-9]?[A-Z]) Соответствует границе, которая существовала между буквой или цифрой в нижнем регистре и необязательной цифрой, за которой сразу же следовала буква с верхним регистром. Например. рассмотрим эту строку a9A. И это регулярное выражение будет совпадать, граница существует между a и 9A, а также граница существует между 9 и A, потому что мы дали [0-9] как необязательный в положительном образе.

+0

Ожидаемый вывод yep.OP: 'EYD Less Than5 Days' –

+0

спасибо обновлено .. –

0

Вы можете просто присоединиться и присоединиться ..

var arr = Regex.Matches(str, @"[A-Z]+(?=[A-Z][a-z]+)|\d|[A-Z][a-z]+").Cast<Match>().Select(m => m.Value).ToArray(); 
Console.WriteLine(String.Join(" ",arr)); 

Регулярное выражение не является сложным вообще, это просто захватывая каждый и соединив их с " "

DEMO

0

Что-то вроде этого нужно сделать

string [email protected]"(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)|(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])"; 
Regex.Replace(input,pattern," "); 
+0

Пожалуйста, подумайте о том, чтобы соответствовать качеству вашего ответа на один, заданный OP на версии JavaScript. Регулярное выражение без комментариев в большинстве своем бесполезно для будущих читателей. –