Verwenden Sie den regulären Ausdruck, um ein beliebiges chinesisches Zeichen in der utf-8-Codierung abzugleichen
Zum Beispiel möchte ich passend ein string, bestehend aus m
zu n
chinesische Zeichen, dann kann ich verwenden:
[single Chinese character regular expression]{m,n}
Gibt es einige regelmäßige Ausdruck einer einzigen chinesischen Zeichen, die irgendwelche chinesischen Zeichen, die vorhanden ist?
InformationsquelleAutor der Frage xiaohan2012 | 2012-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den regulären Ausdruck für eine chinesische (gut, CJK -) Zeichen
werden kann appreviated einfach
Dies setzt Voraus, dass die regex-compiler erfüllt Anforderung RL1.2 Eigenschaften von UTS#18 Unicode, Reguläre Ausdrücke. Perl und Java 7 erfüllen, spec, aber viele andere nicht.
InformationsquelleAutor der Antwort tchrist
In Java,
InformationsquelleAutor der Antwort DayDayHappy
Empfehlung
Um Muster zu vergleichen mit chinesischen Schriftzeichen und andere Unicode-code-points mit einem Flex-kompatibel lexikalische Analysator, könnten Sie die RE/flex lexikalische Analysator für C++, das ist rückwärts kompatibel mit Flex. RE/flex unterstützt Unicode und arbeitet mit Bison zu bauen lexers und Parser.
Schreiben Sie Unicode-Muster (und UTF-8 reguläre Ausdrücke) in RE/flex Spezifikationen wie:
Globale
%option unicode
um Unicode zu aktivieren. Sie können auch einen lokalen Modifikator(?u:)
zu beschränken, Unicode, um ein einzelnes Muster (also alles was sonst noch ASCII/8-bit-wie im Flex):Option
flex
ermöglicht Flex-Kompatibilität, so können Sieyytext
yyleng
ECHO
und so weiter. Ohne dieflex
option RE/flex erwartet, dass Lexer-Methode Aufrufe:text()
(oderstr()
undwstr()
fürstd::string
undstd::wstring
),size()
(oderwsize()
für wide-char-Länge), undecho()
. RE/flex Methodenaufrufe sind IMHO sauberer und weiten char-Operationen.Hintergrund
In die gute alte Flex ich landete Definition von hässlich UTF-8-Muster zu erfassen ASCII-Zeichen und UTF-8-codierte Buchstaben, die für einen compiler-Projekt, die erforderliche Unterstützung für Unicode-Bezeichner
id
:Den
alpha
Muster unterstützt ASCII-Buchstaben, Unterstrich und die Unicode-Codepunkte, die verwendet werden, sind in Bezeichner (\p{L}
etc). Das Muster erlaubt mehr Unicode-code Punkte als absolut notwendig, um die Größe dieses Musters überschaubar, so handelt es sich Kompaktheit für einige Mangel an Genauigkeit zu ermöglichen und eine UTF-8 überlange Zeichen in einigen Fällen, sind nicht gültig UTF-8. Wenn Sie denken, dieser Ansatz als vorsichtig sein, über die Probleme und Sicherheitsbedenken. Verwenden Sie einen Unicode-fähigen scanner-generator statt, wie RE/flex.Sicherheit
Bei der Verwendung von UTF-8 direkt in den Flex-Muster, gibt es einige Bedenken:
Codierung Ihres eigenen UTF-8 patterns in Flex für passend zu jedem Unicode-Zeichen möglicherweise anfällig für Fehler. Muster sollten eingeschränkt werden, um Zeichen in der gültigen Unicode-Bereich nur. Unicode-code-points decken den Bereich U+0000 bis U+D7FF und U+E000 bis U+10FFFF. Der Bereich U+D800 bis U+DFFF ist reserviert für UTF-16-Ersatzzeichen Paaren und sind invalid code Punkte. Wenn Sie mit einem tool zu konvertieren Unicode-Bereich auf UTF-8 stellen Sie sicher ausschließen Ungültiger code Punkte.
Muster zurückweisen sollte zu lange und andere Ungültiger byte-Sequenzen. Ungültige UTF-8-sollte nicht stillschweigend akzeptiert.
Fangen lexikalischen input-Fehler in Ihrem lexer erfordern eine spezielle
.
(dot) entspricht, gültige und ungültige Unicode, einschließlich UTF-8 überschreitungen und Ungültiger byte-Sequenzen, um zu produzieren eine Fehlermeldung, dass die Eingabe zurückgewiesen. Wenn Sie dot als "catch-all-else" erzeugt eine Fehlermeldung, aber dein Punkt stimmt nicht überein Ungültiger Unicode, dann sind Sie lexer hängen ("scanner eingeklemmt") oder Ihre lexer ECHO Abfall-Zeichen auf die Ausgabe von der Flex "default-Regel".Ihrem scanner sollten erkennen, ein UTF BOM (Unicode-Byte-Order Mark) in den input-Schalter auf UTF-8, UTF-16 (LE oder WERDEN), oder UTF-32-LE oder BE).
Wie Sie darauf hinweisen, Muster wie
[unicode characters]
funktionieren nicht bei allen mit der Flex, weil die UTF-8-Zeichen in einer Klammer Liste sind multibyte-Zeichen, und jedes einzelne byte-Zeichen können angepasst werden, aber nicht die UTF-8-Zeichen.Siehe auch ungültige UTF-Codierungen in der RE/flex user guide.
InformationsquelleAutor der Antwort Dr. Alex RE
In Java 7 und höher, das format sollte sein: "\p{IsHan}"
InformationsquelleAutor der Antwort dripp