簡體   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