Java replaceAll只查找字符串的一部分

时间:2014-12-11 21:38:18

标签: java regex string replaceall

我正在尝试解析Java代码文件并更改包含dev名称的注释,并切换格式。评论的一个例子是:

//Code modified by James on 10/28/2014 for report enhancement Start --- C1
//Code modified by Steven on 10/28/2014 to show report enhancement Start --- C1 

我希望他们成为:

// Company Name report enhancement Start --- C1
// Company Name show report enhancement Start --- C1

我所做的replaceAll行如下:

String temp = line.replaceAll("//.*([Jj]ames)|([Ss]teven).*(to|for)", "// Company Name");

但我得到的结果字符串是:

//Code modified by // Company Name report enhancement End --- C57844

我可以将替换字符串更改为仅具有公司名称,但我不明白为什么正则表达式会删除" //由"修改的代码。在它开始时它是匹配器的一部分。关于为什么会发生这种情况的解释以及关于如何改变我的正则表达式的建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

问题在于dev的名字周围的括号。

管道(|)字符左侧部分//.*([Jj]ames) ORing 右侧部分([Ss]teven).*(to|for)。最终你最终匹配任何一个部分。

要解决此问题,您可以按如下方式调整括号:

String temp = line.replaceAll("//.*([Jj]ames|[Ss]teven).*(to|for)", "// Company Name");

这样,OR管道将被限制为匹配[Jj]ames[Ss]teven

答案 1 :(得分:0)

我还没有对此进行过测试,但我认为你需要一个reluctant modifier来实现这一目标。

尝试:

line.replaceAll("//.*?([Jj]ames)|([Ss]teven).*?(to|for)", "// Company Name");

答案 2 :(得分:0)

我写了以下内容:

public static void main(String[] args){
    String line = "//Code modified by James on 10/28/2014 for report enhancement Start --- C1";
    String temp = line.replaceAll("//.*([Jj]ames)|([Ss]teven).*(to|for)", "// Company Name");
    System.out.println(temp);
}

并获得输出://公司名称于2014年10月28日报告增强开始--- C1 所以你的替换是正确的。你的代码中必须有其他错误。