2015-01-23 32 views
7

Esiste comunque la funzione regcomp e di per funzionare correttamente con caratteri multibyte?caratteri multibyte in libc regcomp e regexec

Ad esempio, se il mio modello è i caratteri utf8 猫机+猫, la ricerca di una corrispondenza sulla stringa codificata utf8 猫机机机猫 non riuscirà, dove dovrebbe riuscire.

penso che questo sia perché il personaggio s' rappresentazione byte è \xe6\x9c\xba, e il + sta abbinando uno o più dei byte \xba. Posso far funzionare questa istanza mettendo le parentesi attorno a ciascun carattere multibyte nel pattern, ma poiché questo è per un'applicazione, non posso richiedere agli utenti di farlo.

C'è un modo per contrassegnare un motivo o una stringa in modo che corrisponda come contenente caratteri utf8? Forse dicendo a libc di memorizzare il modello come wchar invece di char?

+0

Parents intorno al char multi-byte non aiutano? – stark

+0

Posso farlo, ma spero in una soluzione che non richieda all'utente di cambiare lo schema in questo modo. Grazie comunque! Ho modificato la domanda per riflettere il tuo commento. –

+0

Perché non usare solo i codepoint '\ x {nnnnnnn}'? Cioè, se il motore regex dovrebbe supportare Unicode. Solitamente la regex e la stringa di destinazione dovrebbero usare la stessa codifica, ma non è una buona idea usare i caratteri Unicode letterali all'interno di una stringa regex. Se il motore lo supporta, legge il carattere in unità di misura, non in unità di byte. – sln

risposta

1

È possibile utilizzare un'espressione regolare per creare un'espressione regolare? Ecco un esempio javascript, (anche se so che non si sta utilizzando js):

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()" />