Anstatt das Leerzeichen und \ t hinzuzufügen, können Sie \ s hinzufügen. \ s passt auch zu anderen Arten von Leerzeichen
Radu Simionescu
Antworten:
71
Entkomme dem Bindestrich.
[a-zA-Z0-9!$* \t\r\n\-]
UPDATE :
Egal, diese Antwort - Sie können den Bindestrich zur Gruppe hinzufügen, müssen ihn aber nicht umgehen. Sehen Sie sich stattdessen die Antwort von Konrad Rudolph an, die viel besser antwortet und erklärt, warum.
Oh ist es? Liegt das daran, dass es sich um eine Charaktergruppe handelt? Mein Fehler.
Neil Barnwell
11
@KonradRudolph Sie haben Recht, aber ich bin nicht sicher, ob die Version ohne Flucht leichter zu verstehen ist. Die beiden möglichen Verwendungen von dash sind verwirrend. Aus diesem Grund gibt es zunächst Fragen dazu. Es ist sicherlich eleganter, wenn Sie es einmal kennen, aber für Anfänger ist es etwas verwirrend.
Christophe Roussy
181
Der Bindestrich ist normalerweise ein normales Zeichen in regulären Ausdrücken. Nur wenn es sich um eine Zeichenklasse handelt und zwischen zwei anderen Zeichen, hat es eine besondere Bedeutung.
So:
[-] entspricht einem Bindestrich.
[abc-]Streichhölzer a, b, coder ein Bindestrich.
[-abc]Streichhölzer a, b, coder ein Bindestrich.
[ab-d]stimmt amit b, coder d( nur hier bezeichnet der Bindestrich einen Zeichenbereich).
@rrr Du willst, dass er es für dich schreibt und es buchstabiert? Sie müssen lediglich den Bindestrich zur Gruppe hinzufügen.
Neil Barnwell
10
@rrrr: Ich glaube, ich habe eine Antwort gegeben. Die Frage war "wie man 'X' schreibt ..." und ich glaube, dass ich erklärt habe, wie man genau das macht. Meine Antwort zu nehmen und die Erklärung auf den tatsächlichen Ausdruck anzuwenden, sollte nicht mehr kognitive Fähigkeiten erfordern, als von einem Erstklässler verlangt wird. In der Tat, das ist genau das, was Erstklässler lernen zu tun , wenn sie grundlegende Arithmetik unterrichtet werden. Fühlen Sie sich frei, meine Annahme zu korrigieren.
@MarkP Nun, duh: Hex-Codes für Zeichen werden vom Front-End-Parser (von C # oder JavaScript oder einer anderen Sprache, die Sie verwenden) in das eigentliche Zeichen konvertiert . Die Verwendung von Hex-Codes entspricht also der Verwendung der tatsächlichen Zeichen, was den Wert der Zeichenfolge betrifft.
Konrad Rudolph
1
@Pshemo Natürlich dummer Fehler. In Bezug auf die Interpretation in [a-c-e]: Dies ist in einigen Regex-Spezifikationen / Engines einfach ungültig. POSIX Regex zum Beispiel verbietet es.
Konrad Rudolph
12
Es ist weniger verwirrend, immer einen Escape-Bindestrich zu verwenden, damit er nicht positionsabhängig sein muss. Das ist eine \-in der Klammer stehende Zeichenklasse.
Aber es gibt noch etwas zu beachten. Einige dieser aufgezählten Zeichen sollten möglicherweise anders geschrieben werden. Unter bestimmten Umständen sollten sie definitiv.
Dieser Vergleich der Regex-Aromen zeigt, dass C♯ einige der einfacheren Unicode-Eigenschaften verwenden kann. Wenn Sie mit Unicode arbeiten, sollten Sie wahrscheinlich die allgemeine Kategorie \p{L}für alle möglichen Buchstaben und möglicherweise\p{Nd} für Dezimalzahlen verwenden. Wenn Sie all diese Satzzeichen und nicht nur HYPHEN-MINUS aufnehmen möchten, sollten Sie die \p{Pd}Eigenschaft verwenden. Vielleicht möchten Sie diese Folge von Leerzeichen auch einfach so schreiben \s, vorausgesetzt, das ist nicht zu allgemein für Sie.
Alles in allem funktioniert das so, dass ein [\p{L}\p{Nd}\p{Pd}!$*]beliebiges Zeichen aus diesem Satz übereinstimmt.
Ich würde das wahrscheinlich sowieso verwenden, selbst wenn ich nicht vorhatte, mich mit dem vollständigen Unicode-Set zu befassen, weil es eine gute Angewohnheit ist, sich darauf einzulassen, und weil diese Dinge oft über ihre ursprünglichen Parameter hinauswachsen. Wenn Sie es jetzt anheben, um es in einem anderen Code zu verwenden, funktioniert es weiterhin ordnungsgemäß. Wenn Sie alle Zeichen fest codieren, wird dies nicht der Fall sein.
Ich stimme dieser Antwort eher zu, je weniger Sie wissen müssen, desto sicherer ist der Code. Dies erinnert mich an Probleme mit den Prioritäten des Bedieners: stackoverflow.com/questions/10007140/… , ich habe Klammern (automatisch von meiner IDE hinzugefügt), ohne sie alle kennen zu müssen. Sie oder jemand anderes können früher oder später durcheinander bringen. Wenn Sie in Ihren Projekten viel mit Regex arbeiten, benötigen Sie möglicherweise fortgeschrittenere Kenntnisse.
Christophe Roussy
4
[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] + und auch [az-0-9] + sind alle gleich. Der Bindestrich zwischen zwei Bereichen wird als a betrachtet symbol.Und auch [a-z0-9 - + ()] + diese Regex erlauben Bindestrich.
Verwenden Sie "\ p {Pd}" ohne Anführungszeichen, um einem beliebigen Bindestrich zu entsprechen. Das '-' Zeichen ist nur eine Art von Bindestrich, der auch in Regex ein Sonderzeichen ist.
Antworten:
Entkomme dem Bindestrich.
[a-zA-Z0-9!$* \t\r\n\-]
UPDATE :
Egal, diese Antwort - Sie können den Bindestrich zur Gruppe hinzufügen, müssen ihn aber nicht umgehen. Sehen Sie sich stattdessen die Antwort von Konrad Rudolph an, die viel besser antwortet und erklärt, warum.
quelle
Der Bindestrich ist normalerweise ein normales Zeichen in regulären Ausdrücken. Nur wenn es sich um eine Zeichenklasse handelt und zwischen zwei anderen Zeichen, hat es eine besondere Bedeutung.
So:
[-]
entspricht einem Bindestrich.[abc-]
Streichhölzera
,b
,c
oder ein Bindestrich.[-abc]
Streichhölzera
,b
,c
oder ein Bindestrich.[ab-d]
stimmta
mitb
,c
oderd
( nur hier bezeichnet der Bindestrich einen Zeichenbereich).quelle
[a-c-e]
: Dies ist in einigen Regex-Spezifikationen / Engines einfach ungültig. POSIX Regex zum Beispiel verbietet es.Es ist weniger verwirrend, immer einen Escape-Bindestrich zu verwenden, damit er nicht positionsabhängig sein muss. Das ist eine
\-
in der Klammer stehende Zeichenklasse.Aber es gibt noch etwas zu beachten. Einige dieser aufgezählten Zeichen sollten möglicherweise anders geschrieben werden. Unter bestimmten Umständen sollten sie definitiv.
Dieser Vergleich der Regex-Aromen zeigt, dass C♯ einige der einfacheren Unicode-Eigenschaften verwenden kann. Wenn Sie mit Unicode arbeiten, sollten Sie wahrscheinlich die allgemeine Kategorie
\p{L}
für alle möglichen Buchstaben und möglicherweise\p{Nd}
für Dezimalzahlen verwenden. Wenn Sie all diese Satzzeichen und nicht nur HYPHEN-MINUS aufnehmen möchten, sollten Sie die\p{Pd}
Eigenschaft verwenden. Vielleicht möchten Sie diese Folge von Leerzeichen auch einfach so schreiben\s
, vorausgesetzt, das ist nicht zu allgemein für Sie.Alles in allem funktioniert das so, dass ein
[\p{L}\p{Nd}\p{Pd}!$*]
beliebiges Zeichen aus diesem Satz übereinstimmt.Ich würde das wahrscheinlich sowieso verwenden, selbst wenn ich nicht vorhatte, mich mit dem vollständigen Unicode-Set zu befassen, weil es eine gute Angewohnheit ist, sich darauf einzulassen, und weil diese Dinge oft über ihre ursprünglichen Parameter hinauswachsen. Wenn Sie es jetzt anheben, um es in einem anderen Code zu verwenden, funktioniert es weiterhin ordnungsgemäß. Wenn Sie alle Zeichen fest codieren, wird dies nicht der Fall sein.
quelle
[-a-z0-9] +, [a-z0-9 -] +, [az-0-9] + und auch [az-0-9] + sind alle gleich. Der Bindestrich zwischen zwei Bereichen wird als a betrachtet symbol.Und auch [a-z0-9 - + ()] + diese Regex erlauben Bindestrich.
quelle
Ist es das, wonach du suchst?
MatchCollection matches = Regex.Matches(mystring, "-");
quelle
Verwenden Sie "\ p {Pd}" ohne Anführungszeichen, um einem beliebigen Bindestrich zu entsprechen. Das '-' Zeichen ist nur eine Art von Bindestrich, der auch in Regex ein Sonderzeichen ist.
quelle