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
Отне ми секунда, но мисля, че е защото .* е алчен. Потърсете неохотни модификатори за regex, това ще ви помогне.   -  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 г. за подобрение на отчета Старт --- C1, така че замяната ви е правилна. Трябва да имате нещо друго грешно във вашия код.

person dan b    schedule 11.12.2014