Java正则表达式查找和更新

Java正则表达式查找和更新,java,regex,Java,Regex,我需要在java项目的每个文件中添加几个import语句。我已经编写了正则表达式来执行此活动 File1.java /********************** * *History Card * ***********************/ package com.employee.details; import java.io.BufferedReader; import java.io.File; public class File1 { // java code } Fil

我需要在java项目的每个文件中添加几个import语句。我已经编写了正则表达式来执行此活动

File1.java
/**********************
*
*History Card
*
***********************/
package com.employee.details;

import java.io.BufferedReader;
import java.io.File;

public class File1
{

// java code
}

File2.java

package com.employee.details;
/**********************
*
*History Card
*
***********************/
import java.io.BufferedReader;
import java.io.File;

public class File1
{

// java code
}
执行更新的代码:

String regEx = "^package .*;";
String pattern = "\0\n\nimport java.io.FileReader;\nimport java.nio.file.Path;";
textFile.replaceAll(regEx,pattern);
它不起作用了。我的代码有什么问题?请帮助我

问题是a)文件开头的注释,b)贪婪的量词,以及c)缺少变量赋值。可能还有一个已删除的包声明。您应该使用以下代码:

String regex = "(package .*?;)";
String replacement = "$1\0\n\nimport java.io.FileReader;\nimport java.nio.file.Path;";
textFile = textFile.replaceFirst(regex, replacement);

Java中的字符串(事实上,在大多数语言中)是不可变的,因此,如果没有大量代码,您无法一次更改该字符串的每个实例。

@RamenChef几乎是正确的,除了分组(即
)是不必要的,并且也不需要反向引用(即
\0
)。因此,下一个代码将起作用:

String regEx = "^package .*;";
String pattern = "$0\n\nimport java.io.FileReader;\nimport java.nio.file.Path;";
textFile = textFile.replaceAll(regEx,pattern);

请注意,代码与此之间的唯一区别是0之前的美元符号和将
replaceAll
结果赋值给
textFile
,因为
String
类型是。

您的问题是java使用了背面引用的美元符号风格,而不是反斜杠风格

在您的替换中,
\0
nul
字符(十六进制零),而不是组零。将其更改为
$0

String pattern = "$0\n\nimport java.io.FileReader;\nimport java.nio.file.Path;";
                  ^----- backslash changed to dollar sign

为什么你不能对我的答案发表评论?@RamenChef因为评论不允许发布格式很好的代码。我认为
\0
是一个错误。我错了吗?@伊利亚,你错了
\0
在某些其他语言中是反向引用,但在Java中不是,它是nul字符(
0x00
\u0000
)。在Java中,反向引用的形式为
$n
,其中n是0-9,组0是整个匹配。