Regulärer Ausdruck: Suchen Sie Leerzeichen (Tabulatoren / Leerzeichen), aber keine Zeilenumbrüche

95

Wie kann ich einen regulären Ausdruck haben, der nach Leerzeichen oder Tabulatoren, aber nicht nach Zeilenumbrüchen sucht? Ich habe es versucht, \saber herausgefunden, dass es auch auf Zeilenumbrüche testet.

Ich benutze C # / WPF, aber es sollte keine Rolle spielen.

Jiew Meng
quelle

Antworten:

186

Verwenden Sie Zeichenklassen: [ \t]

Lekensteyn
quelle
1
Genau richtig für mein Problem. Siehe auch stackoverflow.com/a/25956935/292060 für eine Nur-Perl- \hZeichenklasse, aber es zeigt, dass es viele andere Leerzeichen gibt, falls Sie sie hier zur Liste hinzufügen müssen.
Goodeye
3
warum sollte es vorher ein Leerzeichen geben \t?
Ooker
4
@Ooker Um einen wörtlichen Raum zu erfassen
Codemonkee
Dies passt nicht zu anderen Arten von Räumen, wie andere Antworten erwähnt haben.
Gus
1
Warum ein Leerzeichen vor \ t?
Catbuilts
34

Probieren Sie diesen Zeichensatz aus:

[ \t]

Dies entspricht nur einem Leerzeichen oder einem Tabulator.

Gumbo
quelle
14

Wie @ Eiríkr Útlendi feststellte, berücksichtigt die akzeptierte Lösung nur zwei Leerzeichen: die horizontale Registerkarte (U + 0009) und ein Leerzeichen (U + 0020). Andere Leerzeichen wie nicht unterbrechende Leerzeichen (die sich zufällig in dem Text befinden, mit dem ich mich befassen möchte) werden nicht berücksichtigt. Eine vollständigere Liste mit Leerzeichen ist in Wikipedia enthalten und wird auch in der verknüpften Perl-Antwort erwähnt . Eine einfache C # -Lösung, die diese anderen Zeichen berücksichtigt, kann mithilfe der Zeichenklassensubtraktion erstellt werden

[\s-[\r\n]]

oder, einschließlich der Lösung von Eiríkr Útlendi, erhalten Sie

[\s\u3000-[\r\n]]
erdomke
quelle
3

Hinweis: Für diejenigen , die sie mit CJK - Text (Chinesisch, Japanisch und Koreanisch), der Double-Byte - Raum (Unicode \u3000) ist nicht in enthält \sfür jede Implementierung habe ich versucht , so weit (Perl, .NET, PCRE, Python). Sie werden Ihre Strings müssen entweder normalisieren zuerst (wie von allen ersetzt \u3000mit \u0020), oder Sie einen Zeichensatz, der diese Codepoint enthält zusätzlich zu was auch immer andere Leerzeichen Sie Targeting, wie verwenden müssen [ \t\u3000].

Wenn Sie Perl oder PCRE verwenden, haben Sie die Möglichkeit, die \hKurzform für horizontale Leerzeichen zu verwenden , die anscheinend unter anderem den Einzelbytebereich , den Doppelbytebereich und die Registerkarte enthält. Weitere Informationen finden Sie im Perl- Thread (Match Whitespace, aber nicht Newlines) .

Diese \hAbkürzung wurde jedoch nicht für .NET und C # implementiert, wie ich am besten beurteilen konnte.

Eiríkr Útlendi
quelle
1
Guter Punkt. Java \h(eingeführt in Java 8) enthält \u3000, aber \snicht, es sei denn, Sie setzen den UNICODE_CHARACTER_CLASS-Modus (eingeführt in Java 7).
Alan Moore
0

Wenn Sie den Platz unter dem Code ersetzen möchten, haben Sie in gearbeitetC#

Regex.Replace(Line,"\\\s","");

Für Tab

Regex.Replace(Line,"\\\s\\\s","");

Sameer Bahad
quelle