正则表达式替换Java文件中的所有字符串文字

时间:2013-08-31 11:09:34

标签: java regex string

在我的程序中,我将逐行读取一个java文件,如果该行中有任何字符串文字,我将用(例如)“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 个答案:

答案 0 :(得分:5)

考虑以下正则表达式:

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

以引号开头,后跟零个或多个非引号字符或转义引号字符。最后一个字符必须是引用。

如果将此正则表达式应用于java代码,请记住它还匹配注释中引号内的文本。如果你的评论中有不平衡的引号,它将不匹配字符串文字(然后它将完全相反)。

如果您使用名为String的{​​{1}}变量发布了该示例,则以下内容将起作用:

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);

答案 1 :(得分:2)

基于Uri在this question中使用解析器语法的答案:

"(?:\\[\\'"tnbfru01234567]|[^\\"])*?"

as Java string:

"\"(?:\\\\[\\\\'\"tnbfru01234567]|[^\\\\\"])*?\""

解释(另见Java String escape sequences):

"                          // start with a double quote
  (?:                      // a non-capture group
    \\[\\'"tnbfru01234567] // either an escape sequence
  |                        // or
    [^\\"]                 // not an escape sequence start or ending double quote
  )*?                      // zero or more times, not greedy
"                          // ending double quote

示例(jlordo的解决方案失败了):

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

答案 2 :(得分:0)

s = s.replaceAll("\"([^\n\"\\]+|\\\\.)*\"", "\"ABC\"");

这会搜索引号,以及任何非引号/非后退/非换行符或反斜杠+字符,直到引用。

\"
  (
    [^\n\"\\]+
  |
    \\\\.
  )*
\"
  • [^ ... ]非封闭的字符,范围也可能A-Z
  • |或。
  • .任何字符,默认情况下不是行结尾。
  • ... +一个或多个......
  • ... *零个或多个......

答案 3 :(得分:-1)

您也可以\b(?:(?<=")[^"]*(?=")|\w+)\b使用它。这将找到Double qoutes所包围的所有字符串(&#34;示例&#34;)。

示例代码:

  

String line =&#34; \&#34; Hello \&#34;世界&#34;
  模式模式= Pattern.compile(&#34; \ b(?:(?&lt; = \&#34;)[^ \&#34;] *(?= \&#34;)| \ w +)\ b&#34);
  Matcher matcher = pattern.matcher(line);
  while(matcher.find()){
   //用字符串替换字符串
  }

输出将是 实际行:&#34;您好&#34;世界 答:ABC世界