在我的程序中,我将逐行读取一个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");
}
}
}
我愿意知道正则表达式,它将帮助我检测所有字符串文字,并用我选择的特定字符串替换它们。
编辑:
对我来说真正的挑战是避免字符串中的那些引号字符。 (如果有人在字符串中放置带有转义字符的引号字符)
答案 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世界