Ich habe eine Situation, in der ich eine Zeichenfolge in Java habe, in der es einige Instanzen von "\ r \ n" gibt (Hinweis am Ende). Ich möchte NICHT alle Zeilenumbrüche / Einrückungen ersetzen. nur die spezifischen Vorkommen, bei denen a \ r \ n zusammen sind und gefolgt von Abständen (Nichtzeichen). Darüber hinaus möchte ich keine Vorkommen davon entfernen, wenn es sich am Ende der Datei (EOF) befindet, wo danach keine Zeichen mehr vorhanden sind. Ich möchte, dass die Vorkommen (auf die abgezielt werden soll) durch ein Leerzeichen ersetzt werden.

EX) String fileText = "text \ r \ nMehrText \ r \ n Hallo! \ NWie geht es dir? \ R \ n Mir geht es gut \ r \ n \ r \ n"

String regStr = fileText.replaceAll ("([^ \ [a-z] [0-9] !?]) \ R? \ N", "$ 1") .replaceAll ("+", ""); // Dies funktioniert nicht und berücksichtigt nicht das Ignorieren von EOF-Ereignissen, aber es ist so weit, wie ich es geschafft habe, bevor das Haarziehen begann.

Erwartetes Ergebnis) "text \ r \ nMehr Text Hallo! \ NWie geht es dir? Mir geht es gut \ r \ n \ r \ n"

Ich versuche, einen regulären Ausdruck zu finden, bei dem die beiden Vorkommen von "\ r \ n" vor "Hallo!" und "I'm Fine" werden entfernt, da sie nachgestellte Leerzeichen haben, aber die letzten beiden Vorkommen bleiben allein, da sie sich am Ende der Datei ohne weitere Zeichen befinden.

0
Matt1713 18 Apr. 2018 im 20:40

4 Antworten

Beste Antwort

Ich schlage einen Lookahead-basierten Ansatz vor:

s = s.replaceAll("\r\n\\s+(?!(?:\r\n\\s+)*$)", " ")

Siehe die Online-Java-Demo.

Details:

  • \r\n - CRLF-Zeilenende
  • \s+ - 1 oder mehr Leerzeichen, die ...
  • (?!(?:\r\n\\s+)*$) - ... werden nicht gefolgt
    • (?:\r\n\\s+)* - 0 oder mehr aufeinanderfolgende Vorkommen von CRLF-Zeilenenden, gefolgt von 1+ Leerzeichen, gefolgt von ...
    • $ - Ende der Zeichenfolge.
1
Wiktor Stribiżew 18 Apr. 2018 im 22:30

Das sollte einwandfrei funktionieren, denke ich für alle Szenarien. Probieren Sie es aus.

String patternToReplace = "(?!(\\\\r\\\\n\\s)*$)(\\\\r\\\\n\\s)";
String s = "text\\r\\nMoreText\\r\\n Hello There!\\nHow Are You?\\r\\n I'm Fine \\r\\n \\r\\n ";
System.out.println(s);
s= s.replaceAll(patternToReplace," ");
System.out.println(s);

Ausgabe

text\r\nMoreText\r\n Hello There!\nHow Are You?\r\n I'm Fine \r\n \r\n 
text\r\nMoreText Hello There!\nHow Are You? I'm Fine \r\n \r\n 
1
Nikhil 18 Apr. 2018 im 19:59

Ich würde einen völlig anderen Ansatz vorschlagen:

  1. Teilen Sie den String in eine Liste oder ein Array (möglicherweise durch das Trennzeichen \s*\r\n\s*).
  2. Normalisieren Sie jedes Listenelement (z. B. Trimmen, Konvertieren mehrerer Zeilenumbrüche in einen usw.).
  3. Fügen Sie die Liste erneut mit einem Trennzeichen Ihrer Wahl hinzu

Z.B.

String repaired = Arrays.stream(text.split("\s*\r\n\s*")
                        .map(String::trim) // possibly more .map() calls
                        .filter(s->!s.isEmpty())
                        .collect(Collectors.joining("\n"));
0
Sean Patrick Floyd 18 Apr. 2018 im 22:42

Ich habe die Lösung gefunden.

String testString = "text\r\nMoreText\r\n Hello There!\nHow Are You?\r\n I'm Fine \r\n \r\n "
String configuredString = testString.replaceAll("(\\r\\n){1}[\\s]+\\b", " ");

Dies gibt mir die erwartete Ausgabe.

- The (\\r\\n) signifies I want to look for any "\r\n" within the string.
- The {1} means how often this shall occur.  In this case, once.  The replaceAll() method will handle going through the entire string to find all instances of any more matches.
- [\\s] adds a trailing space so now I'm looking for any occurrence of "\r\n " instead of just "\r\n".
- the + signifies that the character in the square brackets can occur once but not more than once (in this case, a space).
- the \\b causes to ignore all matches right before the beginning of next character.  So this will ignore any EOF occurrences as there are no characters anywhere after the "\r\n " occurrences at the end of file/string.

EDIT: Während dies mir die Ausgabe gab, die ich suchte; Es wurde gezeigt, dass es Fälle (wie Sonderzeichen und Interpunktion) gibt, die nicht berücksichtigt werden. Schauen Sie sich die Antwort an, die Wiktor Stribiżew gemacht hat und die den für diese Fälle benötigten Regex-Ausdruck detailliert beschreibt und wie er aufschlüsselt, was das alles bedeutet.

0
Matt1713 23 Apr. 2018 im 19:55