



Я бы поставил \r\n, \r и \n как три альтернативы, разделенные |. Если поставить \r\n первым, другие альтернативы не будут совпадать при наличии последовательности \r\n.
input.replaceAll("\r\n|\r|\n", "\r\n")
@TimBiegeleisen Да, но это то, что я считаю самым простым и наиболее четко передает 3 правила в вопросе. В любом случае это не влияет на результат. :D
Да, согласен, теперь, когда я думаю о твоем ответе, логика чистая +1.
Обратите внимание, что в Java 8 и более поздних версиях есть средство сопоставления разрывов строк — \R, которое будет соответствовать любому разделителю строк.
Просто говорю, но я думаю, что одиночные \r разделители строк в наши дни редки. Интересно, будет ли \r\r\n восприниматься как две строки \R?
@Chaosfire Хе-хе, нет. Welcome to JShell -- Version 17.0.11 | For an introduction type: /help intro jshell> "wonder if \r\r\n will".lines().count(); $1 ==> 3 jshell> new Scanner("wonder if \r\r\n will").useDelimiter("\\R").tokens().count();$2 ==> 3 говорит jshell Интересно узнать, что об этом говорит Windows VMS
Вы можете попробовать заменить по следующему шаблону:
\r(?!\n)|(?<!\r)\n
Это будет соответствовать возврату каретки, за которым не следует символ новой строки (т. е. \r, но не \r\n CRLF). В противном случае он будет соответствовать только одному символу новой строки, которому не предшествует возврат каретки (опять же, не CRLF).
Использование:
input.replaceAll("\r(?!\n)|(?<!\r)\n", "\r\n");
Для интересующихся: конструкция (?! представляет собой отрицательное утверждение Lookahead: Regular-expressions.info/lookaround.html
Нет смысла заменять
\r\nсамим собой, верно?