私が取り組んでいるコード生成ツールでは、文字列を取得して、そこから有効な Java 変数名を生成する必要がありますが、それを行う最善の方法がわかりません。
例えば:
"123 this is some message !"
=> _123_this_is_some_message
(または類似のもの)
ありがとう
私が取り組んでいるコード生成ツールでは、文字列を取得して、そこから有効な Java 変数名を生成する必要がありますが、それを行う最善の方法がわかりません。
例えば:
"123 this is some message !"
=> _123_this_is_some_message
(または類似のもの)
ありがとう
すべての無効な文字を以下のコードのようなものに置き換えると仮定すると_
(大まかな例)、動作する可能性があります。名前の競合などのロジックを追加したい場合があります。これはJLS #3.8 に基づいています。
識別子は、Java 文字と Java 数字の無制限の長さのシーケンスであり、最初の文字は Java 文字でなければなりません。
[...]
「Java 文字」は、メソッド Character.isJavaIdentifierStart(int) が true を返す文字です。
「Java 文字または数字」は、メソッド Character.isJavaIdentifierPart(int) が true を返す文字です。
public static void main(String[] args) {
String s = "123 sdkjh s;sdlkjh d";
StringBuilder sb = new StringBuilder();
if(!Character.isJavaIdentifierStart(s.charAt(0))) {
sb.append("_");
}
for (char c : s.toCharArray()) {
if(!Character.isJavaIdentifierPart(c)) {
sb.append("_");
} else {
sb.append(c);
}
}
System.out.println(sb);
}
ランダムな文字列を有効な Java 識別子に変換したい。Java 言語仕様の §3.8によると、識別子の定義は次のとおりです。
Identifier :
IdentifierCharsですが、Keyword 、BooleanLiteral 、またはNullLiteralではありませんIdentifierChars :
JavaLetter
IdentifierChars JavaLetterOrDigitJavaLetter :
Java 文字である任意の Unicode 文字JavaLetterOrDigit :
Java の文字または数字である任意の Unicode 文字
次に、入力をステップ実行し、無効な文字を有効な文字 (アンダースコアなど) に置き換えるか、完全に削除するだけです。Java は、指定された文字がJavaLetterまたはJavaLetterOrDigitCharacter
であるかどうかを示すクラス内のメソッドも提供します。(有効な文字のセットは小さく、無効な文字のセットは膨大であるため、これは無効な文字を除外しようとするよりもはるかに簡単です。)isJavaIdentifierStart()
isJavaIdentifierPart
最後に、結果が数字で始まらないこと、またはキーワードまたはリテラルが残されていないことを確認してください。競合が発生する可能性があり、望ましくない場合は、必要に応じて結果に数値を追加して、一意の値を取得できます。
あなたがすべき:
\\s+
と置き換えます_
\\W+
_
、プレフィックスとして追加します^\d
だから何か
"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "")