Regulärer Ausdruck für Leerzeichen?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du musst nach folgendem Ausdruck suchen:

(\b|^)\s{1,2}(\b|$)

"\b" → Wort-Anfang oder Ende
"^" → Zeilenanfang
"$" → Zeilenende
"{n,m}" → mindestens der Länge n, aber höchstens der Länge m

Wenn Du einfach nur "\s{1,2}" in einer 3-Leerzeichen-Zeichenkette suchen würdest, dann würdest Du an der 1. und 2. Position jeweils einen Treffer landen und darum wäre dieser Suchstring nicht eindeutig. Also brauchst Du definierte Separatoren, welche selbst aber keine Zeichenklassen darstellen.

Wenn Du allerdings genau 2 Leerzeichen suchst, dann so:

(\b|^) {2}(\b|$)

(Bitte beachte das Leerzeichen)

"\s" steht nämlich für Whitespaces und nicht nur explizit für Leerzeichen.

Der letzte Befehl hats gebracht, vielen Dank :)

1
@desperateuser91

Hm, ich hab festgestellt, dass ich mit dem Suchbefehl nicht alle doppelten Leerzeichen erwische. Da das \b den Wortanfang/das Wortende markiert, sind davon keine Satzzeichen betroffen. Steht vor oder nach dem doppelten Leerzeichen also z.B. , . ! ? : oder " dann findet er die Stellen nicht, sondern nur die doppelten Leerzeichen zwischen Wörtern. Ich habe daher den Befehl wie folgt ergänzt:

(\b|[.]|,|:|!|[?]|"|^) {2}(\b|[.]|,|:|!|[?]|"|$).

Das Problem hierbei ist jedoch, dass anders als bei \b die Satzzeichen bei der Suche mit markiert werden, was das Ersetzen schwierig macht, weil ich nicht mehr alle Stellen einfach mit " " ersetzen kann.. gibts dafür ne Lösung?

0
@desperateuser91

Es gibt hier noch eine Möglichkeit, aber die funktioniert nicht auf allen Engines:

(?<! )  (?! )

Die erste Klammer ist ein negativer Look-Behind und die zweite ein negativer Look-Ahead. Die Mengenangabe der Leerzeichen hab ich hier einfach mal durch 2 Leerzeichen verkürzt.

Ansonsten wäre es an dieser Stelle nun doch mal wichtig zu wissen, was genau Dein Vorhaben ist, bzw. was Du mit den doppelten Leerzeichen machen willst, um bessere Alternativen zu finden.

Wenn Du alle doppelten Leerzeichen in einfache Leerzeichen ersetzen willst, dann gibt es hier auch wesentlich einfachere Wege, sogar ohne RegExp.

0
@MarkusGenervt

Wie Du schon sagst, ich will alle doppelten Leerzeichen finden und durch einfache Leerzeichen ersetzen. Der Grund dafür, dass es nicht mehr als 2 Leerzeichen sein dürfen ist der, dass in den Textdateien auch eine unbestimmte Anzahl von Leerzeichen zur Zentrierung genutzt wurde. Das Programm, das die Textdateien auslesen soll, kann keine Zentrierung, daher der Weg über die Leerzeichen. Und wenn ich jetzt nur nach " " suchen würde, würde er halt auch all die Zentrierungen finden, was er nicht soll

0
@desperateuser91

Dann versuch einfach mal das hier:

Suchen:

(^|[^ ])  ([^ ]|$)

Ersetzten:

\1 \2

oder für die andere Syntax:

$1 $2
0
@MarkusGenervt

Also bei:

(^|[^ ])  ([^ ]|$)

hab ich wieder das Problem, dass vor und nach den Leerzeichen jeweils ein Zeichen mit markiert ist, wodurch man nicht mehr einfach ersetzen kann.

Aber der Befehl funktioniert:

(?<! )  (?! )

Kann ich da denn nicht einfach ein Leerzeichen zum Ersetzen angeben?

0
@desperateuser91

Beim obigen Suchmuster musst Du das Ersetzungsmuster mit berücksichtigen! Da werden zwar die umgebenden Zeichen mit gefunden und markiert, aber in der Ersetzung beibehalten durch die Rückwärtsreferenzen "$1" und "$2", bzw. "\1" und "\2" inkl. dem nun einfachen Leerzeichen dazwischen.

Wenn der untere Befehl (Look-Ahead/Behind) allerdings funktioniert, dann reicht das Ersetzungsmuster " " (ein Leerzeichen), weil dann nur die beiden Leerzeichen zwischen diesen Ausdrücken als Treffer zurück gegeben werden.

1
@MarkusGenervt

Ich muss nochmal stören. Wenn ich Stellen finden möchte, an denen zwischen Komma und Buchstabe ein Leerzeichen fehlt, was geb ich da sein?

Das war mein Versuch: ,[A-Z|a-z]

Aber da wird auch wieder der Buchstabe nach dem Komma mit markiert.

Ich versteh den Befehl von eben nicht, deshalb weiß ich nicht, wie ich ihn an den Neuen anpassen muss.

0
@desperateuser91

Also zunächst mal ist das Pipe innerhalb der Buchstaben-Gruppe überflüssig und diese Gruppe beinhaltet auch keine Umlaute, Ligaturen, Akzente, etc.

"A-Z" ohne Groß/Kleinschreibung wäre einfach "[A-Za-z]" ohne ODER-Verknüpfung. Dein Beispiel würde das Pipe-Symbol mit implizieren. Die ODER-Verknüpfung findet nur in runden Klammern ihre Angewendung.

Aber so geht das, was du meinst:

Ich habe hier mal das Leerzeichen durch das Steuerzeichen "␢" ersetzt, damit man es besser lesen kann.

"(,)(\w)" → "$1␢$2"

oder

"(?<=,)(?=(\w))" → "␢"

oder einfach

",\b" → ",␢"

Im ersten Beispiel werden einfach die beiden Zeichen zusätzlich mit dem Leerzeichen ersetzt.

Im zweiten Beispiel wird das Look-Around-Verfahren angewandt, was aber nicht bei allen Engines so funktioniert. Daher ist davon im Allgemeinen abzuraten. Hier ist auch die Klammer um "\w" wichtig, weil Look-Around-Ausdrücke sonst nur Literale erlauben. Einzige Ausnahmen ist der Look-Ahead und dann mit den runden Klammern zur Vorauswertung.

Im letzten Beispiel wird einfach das Komma literal wiederholt und das Word-Boundary (\b) muss nicht wiederholt werden, da es immer eine leere Zeichenfolge ist. Das ist auch die simpelste Ersetzung und die ist immer zu bevorzugen.

0
@MarkusGenervt

mit \w und \b hab ich es auch schon versucht, aber das funktioniert nicht, da im Text auch so Sachen stehen wie:

**********Event68********** (38,5) - EV0068

Und da werden halt auch diese Zahlen in den Klammern mit getroffen.

Da ich keinen Befehl gefunden hab, der nur Buchstaben trifft und keine Zahlen (bzw. ich dachte eigentlich, dass das \w sei, aber da hab ich mich scheinbar geirrt), hab ich es mit A-Za-z versucht

0
@desperateuser91

Das geht auch, wenn Du keine Sonderbuchstaben im Text hast. Für das deutsche Alphabet kannst Du das aber auch erweitern:

[A-ZÄÖÜa-zäöüß]

oder wenn der Engine das hergibt auch

[:alpha:]

0
@MarkusGenervt

Gibt es auch einen Befehl um einen Begriff auszuschließen? Wenn ich z.B. nach Stellen suchen möchte, an denen das Leerzeichen zwischen Punkt und Buchstabe fehlt. Jedoch vor dem Punkt kein \ stehen darf.

0
@desperateuser91

Meine Güte, Du hast aber echt schräge Extra-Würste in petto. 😁

Klar geht das:

"(?<!\\)\.(?=(\w))" → ".␢"

Und wenn es keine Ziffer sein darf dann:

"(?<!\\)\.(?=([:alpha:]))" → ".␢"

Aber hier mal ein Überblick:

https://de.wikipedia.org/wiki/Regulärer_Ausdruck

und hier die ausführliche Hilfe:

https://www.regular-expressions.info

Das ist schon ein bisschen vertrackt, aber mit RegExp kannst Du praktisch alles suchen und ersetzen. Zumindest hatte ich bisher noch nichts, was nicht ging. Aber wenn Du auch nur ein Zeichen vergisst oder falsch setzt, dann wirst Du rammdösig beim Suchen des Fehlers! 😆

0
@MarkusGenervt

:D ja, aber wenn ich diese Ausnahmen nicht mache, mache ich mehr kaputt als ich korrigiere. Da muss man schon genau hingucken, was man verändert. Mir reicht meistens schon der normale Suchlauf, aber da hat mir Notepad++ auch schon große Dienste erwiesen. Mit einem Klick 100e von Dateien aufeinmal zu korrigieren ist toll xD

0
@desperateuser91

Also wenn alles wirklich einheitlich formatiert ist und man das Muster genau identifizieren kann, dann ist es super-bequem mehrere Dateien auf einmal durchzurödeln.

Ich muss allerdings aus meiner Erfahrung heraus sagen, dass es besser ist, sich die Mühe zu machen Anzeige-seitenweise zu verarbeiten, weil man hier erstens auf einen Blick Ersetzungsfehler sofort erkennen kann und diese dann zweitens auch rückgängig machen kann. Bei einer Stapelverarbeitung kannst Du nichts wieder rückgängig machen!

0
@MarkusGenervt

Was meinst Du mit "Anzeige-seitenweise"? Naja, ich lass mir auch immer erst die Suchergebnisse anzeigen, bevor ich sie ersetze. Zu oft denke ich, dass ich damit genau die Ergebnisse ersetze, die ich möchte und hinterher betrifft das doch noch andere Textstellen. Aber wenn man die Suchtreffer erst kontrolliert, kann ja eigentlich nichts schief gehen.

0
@desperateuser91

Ich meine, nur das markieren und verarbeiten, was auf den Monitor passt, ohne blättern zu müssen, so dass man alles im Blick hat. Das ist übersichtlicher, als den ganzen Text zu verarbeiten und geht schneller als alles einzeln zu bestätigen. Doch das braucht schon Übung.

0
@MarkusGenervt

Kann man auch nach Begriffen suchen, die sich auf zwei Zeilen erstrecken? Speziell nach zwei Wörtern, wovon sich eins am Ende einer Zeile und das andere am Anfang der nächsten befindet. Und kann man die auch ersetzen? Das erste soll so bleiben und das zweite soll verändert werden

0

Hallo!

Ich habe es eben mal ausprobiert:

Doppelte Leerzeichen werden im "normalen Suchmodus" gefunden, wenn man in der Suchzeile einfach zwei Leerzeichen hintereinander eingibt.

Details zu den "Regulären Ausdrücken" findest Du hier:

http://docs.notepad-plus-plus.org/index.php/Regular_Expressions

Ansonsten kann man auch auf Youtube zu dem Thema fündig werden:

https://www.youtube.com/results?search_query=notepad%2B%2B+reguläre+ausdrücke+suchen+ersetzen

Gruss,

Martin

Hi, das Problem wenn man einfach nur zwei Leerzeichen eingibt ist, dass auch Ergebnisse mit mehr als 2 Leerzeichen gefunden werden. Und das wollte ich in meinem Fall vermeiden. Trotzdem danke, ein anderer User hat schon den richtigen Befehl geliefert.

0

versuch "spacespace" oder " " eins von beiden funzt

wenn ich " " eingebe bekmme ich auch Ergebnisse mit mehr als 2 Leerzeichen. Es dürfen aber nur 2 sein

0

Ich kenen die RegExps von Notepad++ nicht, aber entweder Du setzt 2 Leerzeichen in Deinen Suchstring, oder Du nutzt sowas wie {n} für die Zahl der Wiederholungen.

das Problem ist, dass mir dann auch Ergebnisse mit mehr als 2 Leerzeichen angezeigt werden. Also wenn ich nur " " eingebe ohne Anfüuhrungsstriche. Wie ich das mit dem n eingeben muss, weiß ich nicht

0
@desperateuser91

Na, dann muß Du eben sagen, daß vorher udn nachher eben keine Leerzeichen sein dürfen. \S\s\s\S sollte ebenso funktionieren wie \S \S, oder \S {2}\S, oder falls notepad ++ auch word boundaries kennt, dann damit arbeiten.

Nachtrag: \w\s\s\w müßte auch klappen

0

klingt nach tab nicht nach leerzeichen.

Was möchtest Du wissen?