2

在我的程序中,我将逐行读取 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

4 回答 4

5

考虑以下正则表达式:

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

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

如果将此正则表达式应用于 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 回答
2

基于 Uri 在这个问题中使用解析器语法的回答

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

作为Java字符串:

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

说明(另见Java 字符串转义序列):

"                          // 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);
于 2014-12-01T09:56:36.977 回答
0
s = s.replaceAll("\"([^\n\"\\]+|\\\\.)*\"", "\"ABC\"");

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

\"
  (
    [^\n\"\\]+
  |
    \\\\.
  )*
\"
  • [^ ... ]非封闭字符,范围也可能A-Z
  • |或者。
  • .任何字符,默认不是行尾。
  • ... +一种或多种……
  • ... *零个或多个 ... 。
于 2013-08-31T11:21:59.980 回答
-1

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

示例代码:

String line="\"Hello\" World"
Pattern pattern = Pattern.compile("\b(?:(?<=\")[^\"]*(?=\")|\w+)\b" );
Matcher matcher = pattern.matcher(line);
while(matcher.find()) {
//用你的字符串替换字符串
}

输出将是实际行:“Hello” World 答案:ABC World

于 2013-08-31T11:25:25.233 回答