2014-08-28 67 views
1

我需要用连字符将字符串分解成单词。例如:如何编写这个Java正则表达式?

“WorkInProgress”转换为“工作进行中”

“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]”相同' – 2014-08-28 01:37:21

回答

3

你可以使用一个负回顾后,

正则表达式:

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

替换字符串:

-$1 

DEMO

说明:

(?<!^)负回顾后在此使用,其中所断言的前进字符[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

这是一个通用解决方案。 – 2014-08-28 01:48:21

2

你不能在一个字符类|;它会被解释为一个文字垂直栏字符。尝试:

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

试试这个

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

我不知道这些字符类! – 2014-08-28 01:53:57

+0

任何在Character类中以“is”开头的方法都可以在Java正则表达式中用作\ p {javaMethodNameWithoutIs} – 2014-08-28 01:59:41

+0

感谢ЕвгенийОнегин(EugèneOnéguine):),它是一个很棒的助记符工具。 – 2014-08-28 02:06:52