大写字母后插入空格
如何将"HelloWorld"
为"Hello World"
。拆分必须基于大写字母,但应排除第一个字母。
PS :我知道使用String.split然后合并。只想知道是否有更好的方法。
String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2");
这个正则表达式搜索一个小写字母,后跟一个大写字母,并用前者,空格和后者替换它们(用空格有效地将它们分开)。 它将它们中的每一个放在一个捕获组()
中,以便能够通过反向引用( $1
和$2
)重用替换字符串中的值。
要查找大写和小写字母,它使用\p{Ll}
和\p{Lu}
(而不是[az]
和[AZ]
),因为它处理Unicode标准中的所有大写和小写字母,而不仅仅是在ASCII范围内(正则表达式中对Unicode的这个很好的解释主要适用于Java)。
更好是主观的。 这需要更多的代码行:
public static String deCamelCasealize(String camelCasedString) { if (camelCasedString == null || camelCasedString.isEmpty()) return camelCasedString; StringBuilder result = new StringBuilder(); result.append(camelCasedString.charAt(0)); for (int i = 1; i < camelCasedString.length(); i++) { if (Character.isUpperCase(camelCasedString.charAt(i))) result.append(" "); result.append(camelCasedString.charAt(i)); } return result.toString(); }
在实用程序类中隐藏这个丑陋的实现并将其用作API(从用户角度看是好的;))
String s = "HelloWorldNishant"; StringBuilder out = new StringBuilder(s); Pattern p = Pattern.compile("[AZ]"); Matcher m = p.matcher(s); int extraFeed = 0; while(m.find()){ if(m.start()!=0){ out = out.insert(m.start()+extraFeed, " "); extraFeed++; } } System.out.println(out);
版画
Hello World Nishant
如果你不想使用正则表达式,你可以遍历字符串中的字符,将它们添加到stringbuilder中(如果遇到不是第一个的大写字母,则向字符串构建器添加空格):
String s = "HelloWorld"; StringBuilder result = new StringBuilder(); for(int i=0 ; i
伪代码:
String source = ...; String result = ""; // FIXME: check for enf-of-source for each letter in source { while current letter not uppercase { push the letter to result; advance one letter; } if not the first letter { push space to result; } push the letter to result; }
- 为什么在此忽略此Java运算符优先级?
- 如何减少GridLayout中JCheckbox之间的空间
- 用Java从MySQL读取blob
- Java awt.Robot无法在虚拟机内部工作?
- 如何从Spring WebClient的ClientResponse中获取最佳字节数组?
- 关于工厂设计模式通过反思
- 从java程序调用SVN命令
- java.lang.ClassNotFoundException / NoClassDefFoundError for com / fasterxml / jackson / databind / ObjectMapper with Maven
- 在非单例bean上修复Spring代理上的BeanNotOfRequiredTypeException?