2016-04-15 25 views
4

Dies ist eine Frage zu der Antwort in der Frage Check a string to see if all characters are hexadecimal values.Anker in regulären .NET-Ausdrücken

Die vorgeschlagene reguläre Ausdruck ist die folgende:

\A\b[0-9a-fA-F]+\b\Z 

Nun \A und \Z scheinen jeweils das Äquivalent zu ^ und $ zu sein. \Z verhält sich anders, indem es einen Zeilenumbruch nach dem Abgleich zulässt (dies kann sein oder auch nicht beabsichtigt sein).

Was ich nicht verstehe ist, warum der \b "an Wortgrenze" -Anker verwendet wird. Ist der Anfang/das Ende eines Strings nicht immer eine Wortgrenze?

Schließlich könnte die Regex als ^[0-9a-fA-F]$ mit dem gleichen Verhalten umgeschrieben werden (Ignorieren der nachlaufenden \n Problem). Fehle ich etwas? Wird \b für einen seltsamen Randfall benötigt?

Testfälle:

123ABC -> true 
123def -> Returns true 
123g -> Returns false 
+0

Ja, ich kann mir nichts vorstellen, was das '\ b' erreicht. – smead

Antwort

1

Die word boundary \b Einstimmungen zwischen Nicht-Wort und Wortzeichen, und auch zu Beginn der Zeichenfolge, wenn das erste Zeichen ein Wortzeichen, und am Ende, wenn das letzte Zeichen ist ein Wort Charakter.

Somit ist \A\b[0-9a-fA-F]+\b\Z gleich \A[0-9a-fA-F]+\Z weil alle Zeichen in der Zeichenfolge Wort Zeichen lang sein ([0-9] Ziffern oder Buchstaben [a-fA-F]) für das Muster, um es anzupassen.

Es wäre eine andere Geschichte in diesem Fall: \A\b[0-9a-fA-F-]+\b\Z, die nur Zeichenfolgen mit Wort Zeichen am Anfang und Ende übereinstimmen würde.

Verwenden Sie \z, um eine ganze Zeichenfolge zuzuordnen, wobei am Ende keine \n zulässig ist.