2

私のプログラムでは、Javaファイルを1行ずつ読み取ります。その行に文字列リテラルがある場合は、それを(たとえば)「ABC」に置き換えます。

そうするための正規表現はありますか?

元。プログラムに渡された Java ファイルが次の場合:

public class TestClass {

    private static final boolean isNotThis = false;

    public static void main(String[] args) {
        String x = "This is a test String";
        dummyMethodCall();
        if(isNotThis){
            makeItThat();
            System.out.println("work is done");
        }
    }
}

次に、出力 Java ファイルは次のようになります。

public class TestClass {

    private static final boolean isNotThis = false;

    public static void main(String[] args) {
        String x = "ABC";
        dummyMethodCall();
        if(isNotThis){
            makeItThat();
            System.out.println("ABC");
        }
    }
}

すべての文字列リテラルを検出し、選択した特定の文字列に置き換えるのに役立つ正規表現を知りたいです。

編集:

私にとっての本当の課題は、文字列内の引用符を避けることです。(誰かが文字列内にエスケープ文字を含む引用文字を入れた場合)

4

4 に答える 4

5

次の正規表現を検討してください。

String regex = "\"(?:\\\\\"|[^\"])*?\"";

引用符で始まり、その後に 0 個以上の引用符以外の文字またはエスケープされた引用文字が続きます。最後の文字は引用符でなければなりません。

この正規表現を Java コードに適用する場合は、コメント内の引用符内のテキストにも一致することに注意してください。コメントにアンバランスな引用符があると、文字列リテラルと一致しません (その場合、正反対に一致します)。

String次の名前の変数に投稿した例がある場合はexample、次のように機能します。

String wanted = example.replaceAll(regex, "\"ABC\"");

完全な例を次に示します。

String literal = "String foo = \"bar\" + \"with\\\"escape\" + \"baz\";";
String regex = "\"(?:\\\\\"|[^\"])*?\"";
String replacement = "\"\"";
String wanted = literal.replaceAll(regex, replacement);
System.out.println(literal);
System.out.println(wanted);

版画

String foo = "bar" + "with\"escape" + "baz";
String foo = "" + "" + "";
于 2013-08-31T19:04:30.867 に答える