7

私が取り組んでいるコード生成ツールでは、文字列を取得して、そこから有効な Java 変数名を生成する必要がありますが、それを行う最善の方法がわかりません。

例えば:

"123 this is some message !"=> _123_this_is_some_message(または類似のもの)

ありがとう

4

3 に答える 3

11

すべての無効な文字を以下のコードのようなものに置き換えると仮定すると_(大まかな例)、動作する可能性があります。名前の競合などのロジックを追加したい場合があります。これは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);
}
于 2012-10-05T21:49:18.960 に答える
4

ランダムな文字列を有効な Java 識別子に変換したい。Java 言語仕様の §3.8によると、識別子の定義は次のとおりです。

Identifier :
IdentifierCharsですが、Keyword 、BooleanLiteral 、またはNullLiteralではありませ

IdentifierChars :
JavaLetter
IdentifierChars JavaLetterOrDigit

JavaLetter :
Java 文字である任意の Unicode 文字

JavaLetterOrDigit :
Java の文字または数字である任意の Unicode 文字

次に、入力をステップ実行し、無効な文字を有効な文字 (アンダースコアなど) に置き換えるか、完全に削除するだけです。Java は、指定された文字がJavaLetterまたはJavaLetterOrDigitCharacterであるかどうかを示すクラス内のメソッドも提供します。(有効な文字のセットは小さく、無効な文字のセットは膨大であるため、これは無効な文字を除外しようとするよりもはるかに簡単です。)isJavaIdentifierStart()isJavaIdentifierPart

最後に、結果が数字で始まらないこと、またはキーワードまたはリテラルが残されていないことを確認してください。競合が発生する可能性があり、望ましくない場合は、必要に応じて結果に数値を追加して、一意の値を取得できます。

于 2012-10-05T21:48:38.163 に答える
1

あなたがすべき:

  1. \\s+と置き換えます_
  2. のすべての出現を削除します\\W+
  3. 一致する場合(または一致しない場合でも)_、プレフィックスとして追加します^\d

だから何か

"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "")
于 2012-10-05T21:51:11.347 に答える