2014-08-28 6 views
1

Мне нужно разбить строку на слова дефисом. Например:Как написать это Java-регулярное выражение?

"WorkInProgress" преобразуется в "Work-In-Progress"

"NotComplete" преобразуется в "NotComplete"

Большинство случаев одно слово начинается с капитала и заканчивается в нижнем регистре.

Но есть одно исключение: «CIInProgress» следует преобразовать в «CI-In-Progress».

Я написал, как код ниже, любой шаблон, который имеет строчный регистр или «CI», за которым следует капитал, будет добавлен «-» в середине. Но он не может работать для «CIInProgress». Может ли кто-нибудь сказать мне, как исправить это?

String str; 
String pattern = "([a-z|CI]+)([A-Z])"; 
str= str.replaceAll(pattern, "$1\\-$2"); 
+0

Вы должны понимать, что класс символов является лишь набор символов, но не набор подстрок. '[A | BC]' означает «A» или «|» или «B» или «C» и является таким же, как '[B | CA]' или '[| CBA]' –

ответ

3

Вы можете использовать отрицательное назад ',

Regex:

(?<!^)([A-Z][a-z]) 

Замена строки:

-$1 

DEMO

Объяснение:

(?<!^) Negative используется с просмотром назад здесь, который утверждает, что исходит символы [A-Z] (прописные), а также следующие [a-z] (в нижнем регистре) не является началом якоря. Заглавная буква и следующая строчная буква будут сопоставляться только в том случае, если она удовлетворяет вышеупомянутому условию. Группы захвата () используются для захвата совпадающих символов, захваченные символы хранятся в группах. Позже вы можете получить захваченные символы, указав его номер индекса группы.

Код:

System.out.println("WorkInProgress".replaceAll("(?<!^)([A-Z][a-z])", "-$1")); 
System.out.println("NotComplete".replaceAll("(?<!^)([A-Z][a-z])", "-$1")); 
System.out.println("CIInProgress".replaceAll("(?<!^)([A-Z][a-z])", "-$1")); 

Выход:

Work-In-Progress 
Not-Complete 
CI-In-Progress 
+0

Это общее решение. –

2

Вы не можете иметь | в классе символов; он будет просто интерпретироваться как буквальный символ вертикальной полосы. Попробуйте:

String pattern = "([a-z]+|CI)([A-Z])"; 
2

попробовать это

str= str.replaceAll("(?<=\\p{javaLowerCase})(?=\\p{javaUpperCase})", "-"); 
+0

Я не знал этих классов персонажей! –

+0

Любой метод, начинающийся с символа «is» в классе символов, может использоваться как \ p {javaMethodNameWithoutIs} в Java regex –

+0

Спасибо Евгений Онегин (Eugène Onéguine) :), это отличный мнемонический инструмент. –

Смежные вопросы