任何人都知道如何隐藏FirstName
到First Name
。
必须根据大写字母进行拆分,但应排除第一个字母。
我知道如何使用拆分来做到这一点。除了拆分功能之外,还有其他方法可以做到这一点。
不是真的split
,只是replaceAll
:
str.replaceAll("(?!^)([A-Z])", " $1")
此解决方案假定您不想在大写英文字母之前添加空格,如果它是字符串中的第一个字符。因此," FirstName"
将成为" First Name"
(注意 2 个空格)。
(?!^)
是负前瞻(?!pattern)
,只是检查这不是字符串的开头^
。我捕获(pattern)
大写英文字母,并在替换中使用捕获的文本$1
($1
意味着捕获组1中捕获的任何内容都放入替换字符串中 - 在这种情况下只有 1 个捕获组)。
另一种在大写英文字母之前添加空格的解决方案,前提是它前面是小写英文字母:
str.replaceAll("(?<=[a-z])([A-Z])", " $1")
(?<=[a-z])
是一个积极的后(?<=pattern)
向检查,检查大写字符[A-Z]
前面是否有小写英文字母[a-z]
。其余的已经在上面解释过了。
模式可以根据要求变化很大。你只给出一个例子而不是具体要求,所以我会大胆猜测并为你挑选一个模式。
比 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 );
您可以使用以下代码快照
String array[]= "FirstMiddleLast".replaceAll("(?!^)([A-Z])", " $1").split(" ");
for(String name:array){
System.out.println(name);
}
您可以创建自己的,如下所示:
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();
}