2009-03-10 10 views
2

Ich verwende Posix C Regex-Bibliothek (Regcomp/Regexec) auf meiner Suchanwendung. Meine Anwendung unterstützt verschiedene Sprachen einschließlich solcher, die Multi-Byte-Zeichen verwenden. Beim Verwenden des Metazeichens für die Wortgrenze (\ b) tritt ein Problem auf. Für Single-Byte-Strings, es funktioniert gut, zum Beispiel:Regex-Wortgrenze für Multi-Byte-Strings

"\ bpaper \ b" Streichhölzer "Papier"

Wenn jedoch die regex und Query-Strings Multi-Byte ist, scheint es nicht, korrekt zu arbeiten, zum Beispiel:

"\ b 紙張 \ b" stimmt nicht überein "紙張"

Bin ich etwas fehlt? Jede Hilfe würde sehr geschätzt werden.

Gewünscht Info:

  • Programmiersprache: C
  • Regex Library: GNU C (regex.h)

Dank.

+0

Könnten Sie uns bitte mitteilen, welche Programmiersprache/Bibliothek Sie für RegExp verwenden? –

+0

@ Ferdinand: angeforderte Informationen hinzugefügt. –

Antwort

4

, wenn der Regex und Query-Strings Multi-Byte ist, scheint es nicht richtig

zu arbeiten Was in diesem Zusammenhang ist „Multi-Byte“? Eine Zeichenfolge in UTF-8 Bytes codiert? Eine locale-spezifische Multibyte-Codierung wie GB?

Wenn Sie nicht mit breiten (Unicode) Strings nativ tun haben, können Sie nicht mehr Unterstützung für Nicht-ASCII-Zeichen erwarten als nur Erkennen sie da sind. POSIX regex gibt keine Zeichenklassen für Bytes außerhalb des ASCII-Bereichs an, daher weiß es nicht, dass eines der Bytes in "\ xe7 \ xb4 \ x99" (die UTF-8-Darstellung von '紙') berücksichtigt werden könnte Wort-Buchstaben; daher sieht es keine Wortgrenzen.

Was einen Buchstaben oder ein Wort in Unicode bildet, ist eine beteiligte Frage als einfaches ASCII regex kann bewältigen. (. Und natürlich, was ein ‚Wort‘ in der chinesischen in sich arguable ist) Wenn alles, was Sie erkennen wollen nur alte Räume ist, könnten Sie das explizit tun:

(\s|^)紙張(\s|$) 
+0

Ich meinte UTF-8 Bytes. Ich habe gerade erkannt, dass das Wortgrenzen-Metazeichen nur für Wortklassen funktioniert, was technisch alphanumerisches Zeichen plus _ bedeutet. Das funktionierte für mich! Vielen Dank! =) –

0

Ich denke, das hängt von der Bibliothek/Programmiersprache, die Sie verwenden, und von der Konfiguration Ihrer RegExp-Bibliothek ab. Wahrscheinlich müssen Sie die Multibyte-Unterstützung aktivieren, der Bibliothek mitteilen, welche Zeichencodierung Sie verwenden oder die Gebietsschemaeinstellungen entsprechend ändern. Einige spezielle Operationen wie \ b oder \ w hängen von diesen Einstellungen ab.

0

Siehe this answer für mehr über Unicode und Wort Grenzen. Die gegebenen Lösungen gelten für die PCRE-Bibliothek, aber die Prinzipien sollten auch für andere gelten.

Verwandte Themen