インターネットでは、定数名のみ(Java規約、SOME_JAVA_NAMING_CONVENTION_CONSTによる)を変換するか、スペースで区切られたフレーズのみを変換するほとんどの専門的な方法が見つかります。
私は断固として十分を持っていなかった、私はより多くの汎用性が必要でした。
自尊心のあるサイクリストにふさわしいので、アルゴリズムを書き始め、少し夢中になりました。 コードから目覚めた後、関数がすべてのフィード行を通常のcamelCaseまたはCamelCaseに変換することがわかりました。
それがしない唯一のことは、結果の行の先頭にある数字を禁止しないことです(JNC規則の場合)。しかし、私はそれを必要としません(必要な場合、1行のコードで追加されます-2番目の埋め込み条件への補充)。
カットの下で何が起こったかを見ることができます。
この関数は、2つの引数を取ります。実際の文字列と、大文字(アンダーキャメルケース)で結果を書き込むように指示するフラグです。
彼女はすべてを一度に行います。 コードには、初心者向けのコメント(この虎の巻が書かれている)が散りばめられています。
残念なことに、2番目の議論は痛みを伴わずに食い止めることができます。
また、実質的に変更なしで、アルゴリズムはjavascriptおよびC#に移植されます。
/** * camelCase ( CamelCase) . * * @param string * @param firstWordToLowerCase (lowercase). */ public static String toCamelCase(String string, boolean firstWordToLowerCase) { char currentChar, previousChar = '\u0000'; // StringBuilder result = new StringBuilder(); // boolean firstLetterArrived = !firstWordToLowerCase; // , lowercase boolean nextLetterInUpperCase = true; // , UPPERCASE // for (int i = 0; i < string.length(); i++) { currentChar = string.charAt(i); /* - ( ) . , - ( ). */ if (!Character.isLetterOrDigit(currentChar) || ( ((Character.isLetter(previousChar) && Character.isLowerCase(previousChar)) || Character.isDigit(previousChar)) && Character.isLetter(currentChar) && Character.isUpperCase(currentChar)) ) { nextLetterInUpperCase = true; if (!Character.isLetterOrDigit(currentChar)) { previousChar = currentChar; continue; } } // , . if (nextLetterInUpperCase && firstLetterArrived) { result.append(Character.toUpperCase(currentChar)); } else { result.append(Character.toLowerCase(currentChar)); } // . firstLetterArrived = true; nextLetterInUpperCase = false; previousChar = currentChar; } // . return result.toString(); }
さて、関数の結果の例
ソース文字列: 'normalCamelCaseName'
結果文字列: 'normalCamelCaseName'
結果の文字列: 'NormalCamelCaseName'(firstWordToLowerCase = false)
=============================
ソース文字列: 'NotCamelCaseName'
結果文字列: 'notCamelCaseName'
結果文字列: 'NotCamelCaseName'(firstWordToLowerCase = false)
=============================
ソース文字列: 'CONSTANT_TO_CAMEL_CASE'
結果文字列: 'constantToCamelCase'
結果文字列: 'ConstantToCamelCase'(firstWordToLowerCase = false)
=============================
ソース文字列:「キャメルケースへのテキスト」
結果文字列: 'textToCamelCase'
結果文字列: 'TextToCamelCase'(firstWordToLowerCase = false)
=============================
ソース文字列:「ラクダケースへのテキスト」
結果文字列: 'textToCamelCase'
結果文字列: 'TextToCamelCase'(firstWordToLowerCase = false)
=============================
ソース文字列:「私たちはSHIFFT、DRUZYAFFKIに向かっている!:)」
結果文字列:「私たちは私たちのシフテッドルゼンツァフキを包みます」
結果の文字列:「OURSHIFFTEDRUSENZAFFKIでの切り替え」(firstWordToLowerCase = false)
=============================
ソース文字列: '-(*&*&%&%$ ^&^ *()Characters *&^%*(Punctuation&$ ... and unreadable ----------- characters ^(Maybe * 90Be&(*?*?:どのように**%?:%何でも!」
結果の文字列:「charactersConfirmationUnreadableSignsMay90Beどれくらいが適切か」
結果の文字列:「罰の兆候、判読不能な兆候、5月90日はどれくらい適切か」(firstWordToLowerCase = false)
=============================
ソース文字列:「そして最後に、句読点付きのロシア文字列(ローカライズ!)」
結果文字列: 'そして最後に、ロシア語の文字列、ローカリゼーションの兆候'
結果文字列: 'INLastRussianStringLanguageStringLocalization'(firstWordToLowerCase = false)