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])
大文字の前に英小文字の alphabet が(?<=pattern)
あるかどうかをチェックする肯定的な後読みです。残りは上記で説明しました。[A-Z]
[a-z]
パターンは、要件に応じて大きく異なります。具体的な要件の代わりに 1 つの例を提供するだけなので、私は大雑把な推測をして、パターンを選択します。
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();
}