2011-01-11 19 views
4

Ich muss das Verhalten von \b am Anfang eines Strings emulieren, wo ich zusätzliche Zeichen zu dem Satz hinzufügen, die zählen als eine Wortgrenze. Im Moment bin ich mit so etwas wie:Wie mache ich eine Regex mit einer Lookbehind Assertion, die immer noch am Anfang einer Zeichenfolge funktioniert

"(?<=\\W|\\p{InCJKUnifiedIdeographs})foo" 

Dies funktioniert wie ich möchte, es sei denn, ich zu Beginn der Zeichenfolge bin wird abgestimmt: in diesem Fall die Behauptung nicht und ich nicht bekommen ein Schlag. Was ich will, ist das Äquivalent von übereinstimmen, wenn ich am Anfang der Zeichenfolge bin oder foo ist ein Nicht-Wort-Zeichen oder ein Ideograph vorangestellt. Aber ich kann nicht die richtige Beschwörung bekommen, um das zu unterstützen.

Irgendwelche Gedanken? Oder ist das unmöglich?

Vielen Dank im Voraus.

+0

Was meinst du mit Übereinstimmung, wenn ich am Anfang der Zeichenfolge bin? Das würde alle Zeichenketten erfassen, weil alle Zeichenketten einen "Beginn der Zeichenkette" haben. – Jaskirat

+0

Es tut nicht: Wenn ich die oben erwähnte Regex gegen die Zeichenkette "foo foobar baz" benutze, findet sie * foo nicht, weil das Aussehen dahinter fehlschlägt. – TreeRex

+1

In den meisten Fällen können Sie erhalten, was Sie wollen, indem Sie die Bedingung umkehren: '(? Kobi

Antwort

12
"(?<=^|\\W|\\p{InCJKUnifiedIdeographs})foo" 

Fügen Sie einfach die Start-of-string Anker zu den Bedingungen Lookbehind.

+0

Danke Robert, das wirkt wie ein Zauber. Irgendwie versuchte ich in den verschiedenen Kombinationen, mit denen ich experimentierte, nicht das Offensichtlichste. – TreeRex

+1

Das Hinzufügen einer Carot führt zu einem Fehler in meinem Fall '((? <=^|) Ist (? = | $)' Https://regex101.com/r/vD5iH9/21 –

+1

@ СашкоЛихенко Das ist eine Einschränkung von Pythons Regex-Engine Es erlaubt nur "fixed width" -Look-Behinds, und die Länge von '^' (null/null?/NaN?) Ist offensichtlich anders als '' (eins). – RobertB