任何人都知道如何将FirstName
转换为First Name
。
分割必须基于大写字母进行,但它应排除第一个字母。
我知道如何使用split进行操作。 除了拆分功能之外,还有其他任何方法可以做到这一点。
答案 0 :(得分:5)
不是split
,只是replaceAll
:
str.replaceAll("(?!^)([A-Z])", " $1")
此解决方案假定您不希望在大写英文字母之前添加空格(如果它是字符串中的第一个字符)。因此," FirstName"
将成为" First Name"
(请注意2个空格)。
(?!^)
为负面预测(?!pattern)
,只是检查这不是字符串^
的开头。我捕获大写英文字母(pattern)
,并在替换$1
中使用捕获的文本($1
表示捕获组中捕获的内容 1 被置于替换中string - 在这种情况下,只有一个捕获组。)
另一种在大写英文字母之前添加空格的解决方案,只有前面是小写英文字母:
str.replaceAll("(?<=[a-z])([A-Z])", " $1")
(?<=[a-z])
是一个积极的后瞻(?<=pattern)
,用于检查大写字母[A-Z]
是否以小写英文字母[a-z]
开头。其余部分已在上面解释过。
根据要求,模式可能会有很大差异。你只举一个例子而不是具体的要求,所以我会猜测并为你挑选一个模式。
答案 1 :(得分:4)
比replaceAll快6到11倍:
StringBuilder s = new StringBuilder( "FirstName" );
for( int i = 1; i < s.length(); ++i ) {
if( Character.isUpperCase( s.charAt( i ))) {
s.insert( i++, ' ' );
}
}
替补席:
long atStart = System.currentTimeMillis();
for( int j = 0; j < 1000000; ++j ) {
StringBuilder s = new StringBuilder( "FirstName" );
for( int i = 1; i < s.length(); ++i ) {
if( Character.isUpperCase( s.charAt( i ))) {
s.insert( i++, ' ' );
}
}
}
long elapsed1 = System.currentTimeMillis() - atStart;
atStart = System.currentTimeMillis();
for( int j = 0; j < 1000000; ++j ) {
String s = "FirstName";
s = s.replaceAll("(?!^)([A-Z])", " $1");
}
long elapsed2 = System.currentTimeMillis() - atStart;
System.err.println( "Ratio: " + elapsed2 / (double)elapsed1 );
答案 2 :(得分:0)
你可以创建自己的东西,如下:
private String split(String string) {
StringBuffer sb = new StringBuffer();
for (Character character: string.toCharArray()) {
if (Character.isUpperCase(character)) {
sb.append(" ");
}
sb.append(character);
}
return sb.toString().trim();
}
答案 3 :(得分:0)
您可以使用以下代码快照
String array[]= "FirstMiddleLast".replaceAll("(?!^)([A-Z])", " $1").split(" ");
for(String name:array){
System.out.println(name);
}