繁体   English   中英

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

[英]Java replaceAll only finding part of string

我试图解析Java代码文件并更改包含开发人员名称的注释,并切换格式。 评论示例如下:

//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

我可以只将替换字符串更改为仅包含公司名称,但是我不明白为什么正则表达式在匹配器的一部分开始时会删除“ // Code by by by”。 解释为什么会发生这种情况,以及有关更改正则表达式的建议。

问题出在开发人员姓名的括号内。

竖线( | )字符取//.*([Jj]ames)的左部分,然后与右部分([Ss]teven).*(to|for) 或运算 最终,您最终会匹配任何一个部分。

要解决此问题,可以按如下所示修改括号:

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

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

我尚未对此进行测试,但是我认为您需要一个勉强的修饰符才能使其正常工作。

尝试:

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

我写了以下内容:

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,所以您的替换是正确的。您的代码中必须还有其他错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM