2017-09-05 2 views
2

Ich habe versucht, einen String, der nur gültige Zeichen hat, zu finden, und ich stieß auf \ P {Cn}, die ich verstehe, um ein zugeordnetes Zeichen zu finden.Wo gehe ich falsch mit P {Cn}?

https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF

Hier sehe ich 0x0870-0x89F ist ein nicht zugewiesenes "Region" (nicht sicher, wie ich es zu nennen).

Wenn ich einen Test auf ein einzelnes/mehrere dieser Zeichen fehlschlagen sollte, scheitert es tatsächlich "\u0880", aber wenn es ein zugeordnetes Zeichen enthält, dann stimmt es nicht überein.

Was könnte ich über diese Situation falsch verstehen? Ich wäre dankbar zu wissen!

Antwort

1

Verwenden Anker mit einem Quantor:

^\P{Cn}*$ 

oder - wenn Sie nicht wollen, eine leere Zeichenfolge entsprechen:

^\P{Cn}+$ 

Sie paßt:

  • ^ - Beginn eine Zeichenfolge
  • \P{Cn}* - alle 0+ Zeichen anders als in der Cn Kategorie
  • $ - Ende der Zeichenfolge (oder \z, um das Ende zu entsprechen).
+0

dies behoben mein Problem, vielen Dank! Ich bin mir immer noch unsicher, warum die Anker den Unterschied ausmachen. Ich meine, warum \ P {Cn} * ist nicht genug, um eine Übereinstimmung _fail_ ohne die Anker zu behaupten, gegeben eine Zeichenkette mit einem nicht zugewiesenen Zeichen irgendwo innerhalb? –

+0

@lilah Die Methode 'Regex.IsMatch' stellt nicht sicher, dass der gesamte String übereinstimmt (im Gegensatz zu' String # Matches' in Java oder 're.fullmatch()' in Python 3). Sie müssen die Regex-Engine anweisen, die Übereinstimmung an beiden Enden der Zeichenfolge explizit zu verankern. –

Verwandte Themen