2015-01-23 12 views
7

Gibt es sowieso libc6 's regexp Funktionen regcomp und regexec ordnungsgemäß mit Multi-Byte-Zeichen zu arbeiten?Multi-Byte-Zeichen in libc regcomp und regexec

Zum Beispiel, wenn mein Muster die utf8 Zeichen 猫机+猫 ist, wird das Finden einer Übereinstimmung auf der utf8 codierten Zeichenfolge 猫机机机猫 fehlschlagen, wo es erfolgreich sein sollte.

Ich denke, das liegt daran, dass der Charakter ‚s Bytedarstellung \xe6\x9c\xba ist, und die + wird eine oder mehrere der Byte \xba entsprechen. Ich kann diese Instanz arbeiten lassen, indem ich Klammern um jedes Multibyte-Zeichen im Muster platziere, aber da dies für eine Anwendung ist, kann ich nicht von Benutzern verlangen, dies zu tun.

Gibt es eine Möglichkeit, ein Muster oder eine Zeichenfolge zu kennzeichnen, die utf8 Zeichen enthält? Vielleicht libc sagen, das Muster als wchar statt char zu speichern?

+0

Parens um das Multi-Byte-Zeichen nicht helfen? – stark

+0

Ich kann das tun, aber ich hoffe auf eine Lösung, die den Benutzer nicht erfordert, das Muster so zu ändern. Trotzdem danke! Ich habe die Frage bearbeitet, um deinen Kommentar zu reflektieren. –

+0

Warum nicht einfach die Codepunkte '\ x {nnnnnnn}'? Das heißt, wenn die Regex-Engine Unicode unterstützen sollte. Normalerweise sollten die Regex- und Zielzeichenfolgen die gleiche Codierung verwenden, aber es ist keine gute Idee, literale Unicode-Zeichen in einer Regex-Zeichenfolge zu verwenden. Wenn die Engine dies jedoch unterstützt, liest sie die char-in-char-Einheiten, nicht die Byte-Einheiten. – sln

Antwort

1

Können Sie eine Regex verwenden, um Ihre Regex zu erstellen? Hier ist ein Javascript-Beispiel (obwohl ich weiß, Sie verwenden js nicht):

function Examp() { 
 
    var uString = "猫机+猫+猫ymg+sah猫"; 
 
    var plussed = uString.replace(/(.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
    uString = "猫机+猫*猫ymg+s\\a+I+h猫"; 
 
    plussed = uString.replace(/(\\?.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("You can even take this a step further and account for a character being escaped, if that's a consideration.") 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
}
<input type="button" value="Run" onclick="Examp()" />