Java replaceAll находит только часть строки

Я пытаюсь проанализировать файл кода 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

Я мог бы просто изменить строку замены, чтобы она содержала только название компании, но я не понимаю, почему регулярное выражение отбрасывает «//Код, измененный» в начале, когда оно является частью сопоставления. Объяснения того, почему это происходит, и предложения по изменению моего регулярного выражения будут оценены.


person Blake B    schedule 11.12.2014    source источник
comment
Мне потребовалась секунда, но я думаю, это потому, что .* жадный. Ищите неохотные модификаторы для регулярных выражений, это вам поможет.   -  person markspace    schedule 12.12.2014
comment
Работает на меня. Можете ли вы предоставить MCVE?   -  person Wintermute    schedule 12.12.2014


Ответы (3)


Проблема в скобках вокруг имен разработчиков.

Символ вертикальной черты (|) берет левую часть //.*([Jj]ames) и выполняет операцию ИЛИ с правой частью ([Ss]teven).*(to|for). В конце концов вы получите соответствие любой из частей.

Чтобы решить ее, вы можете адаптировать скобки следующим образом:

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

Таким образом, канал ИЛИ будет ограничен соответствием [Jj]ames или [Ss]teven.

person M A    schedule 11.12.2014
comment
Спасибо! Наткнулся на это с to|for, совершенно пропустил это с именами разработчиков. - person Blake B; 12.12.2014

Я не проверял это, но думаю, что вам нужен неохотный модификатор, чтобы это работало. .

Пытаться:

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

Я написал следующее:

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);
}

и получил вывод: // Название компании 28.10.2014 для улучшения отчета Start --- C1, поэтому ваша замена верна. У вас должно быть что-то еще не так в вашем коде.

person dan b    schedule 11.12.2014