2013-02-01 13 views
7

zuzulassen Kann mir jemand Regex für die Überprüfung der Zeichenfolge zur Verfügung stellen, die nur Sonderzeichen außer Backslash zulassen sollte. Ich habe versucht,Regulärer Ausdruck, um den umgekehrten Schrägstrich in C#

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$"); 

Aber es scheint nicht

+3

"scheint nicht zu funktionieren" bedeutet? Was macht es, was du nicht erwartest? –

Antwort

8

Entweder es (einmal für C# und einmal für die Regex-Engine) zu entkommen verdoppeln müssen, um zu arbeiten:

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

Oder Sie können verwenden, um die verbatim string feature von C# (beachten Sie die @):

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 

In einer wortgetreuen Zeichenfolge wird der Backslash nicht INTERPRE Wenn Sie eine Escape-Sequenz starten, müssen Sie sie nur einmal für die Regex-Engine deaktivieren.

Ich nehme an, dass Ihr aktueller Code nicht kompiliert. Es sollte etwas in Anlehnung an "Unerkannte Fluchtsequenz" sein.
Der Grund dafür ist, dass Sie drei umgekehrte Schrägstriche gefolgt von einem Leerzeichen haben. Die ersten beiden umgekehrten Schrägstriche werden als Escape-Sequenz interpretiert, die einen umgekehrten Schrägstrich darstellen. Der dritte umgekehrte Schrägstrich wird jedoch so interpretiert, dass eine Escape-Sequenz mit einem Leerzeichen als zweitem Zeichen beginnt. Eine solche Escape-Sequenz existiert nicht, was zu dem Fehler führt.

0

Sie müßten die \ für regex zu entkommen sowie C# String durch Hinzufügen \s für ein einzelnes \ entsprechen.

17

Backslashes müssen in regulären Ausdrücken maskiert werden - und sie auch müssen in C# maskiert werden, es sei denn, Sie verwenden verbatim string literals. Also entweder davon funktionieren sollte:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

davon Beide sorgen dafür, dass die folgende Zeichenfolge Inhalt an den Regex Konstruktor übergeben wird:

^[a-zA-Z0-9\\ ]*$ 

Der Regex Code wird dann den doppelten Backslash sehen und behandeln es als "Ich möchte den Backslash-Charakter wirklich anpassen."

Grundsätzlich müssen Sie immer zwischen "den String-Inhalten, die Sie an die Regex-Engine übergeben wollen" und "der String-Literaldarstellung im Quelltext" unterscheiden. (Dies gilt nicht nur für reguläre Ausdrücke, natürlich. Der Debugger hilft nicht durch Flucht in Watch Windows etc.)

EDIT: Nun, dass die Frage bearbeitet wurde zu zeigen, dass Sie ursprünglich drei Backslashes hatten , das ist einfach nicht gültig C#. Ich vermuten Sie zielten „eine Zeichenkette mit drei Schrägstriche in“, die entweder von diesen sein würde:

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$"); 

... aber Sie brauchen nicht so weit, den Raum zu entkommen, wie der reguläre Ausdruck ist besorgt.

+0

Bitte beachten Sie, dass dem Regex ctor nichts übergeben wird, da der Code nicht kompiliert wird. –

+1

@DanielHilgarth: Der Code, der * in der Frage * vor der Bearbeitung angezeigt hat.(Als ich die Frage beantwortete, zeigte die Frage zwei umgekehrte Schrägstriche. Nicht im Codestil, und ich verstehe, dass der Abschlag drei umgekehrte Schrägstriche hatte, aber ich beantwortete die Frage, die ich sah :) –

+0

Ich formatierte nur den Code. Bitte sehen Sie sich die Quelle der ursprünglichen Revision an. Die drei Backslashes waren von Anfang an da. –

Verwandte Themen