2009-03-10 6 views
2

J'utilise la bibliothèque posix c regex (regcomp/regexec) dans mon application de recherche. Mon application prend en charge différentes langues, y compris celles qui utilisent des caractères multi-octets. Je rencontre un problème lors de l'utilisation de métacaractère de limite de mot (\ b). Pour les chaînes octet, il fonctionne très bien, par exemple:Limite du mot Regex pour les chaînes multi-octets

« \ bpaper \ b » correspond à « papier »

Cependant, si les chaînes de regex et de requête sont multi-octets, il ne semble pas pour fonctionner correctement, par exemple:

"\ b 紙張 \ b" ne correspond pas à "紙張"

Est-ce que je manque quelque chose? Toute aide serait très appréciée.

Info demandée:

  • Langage de programmation: C
  • Regex Bibliothèque: GNU C (regex.h)

Merci.

+0

Pourriez-vous nous dire quel langage de programmation/bibliothèque vous utilisez pour RegExp? –

+0

@Ferdinand: information demandée ajoutée. –

Répondre

4

si les chaînes de regex et de requête sont multi-octets, il ne semble pas fonctionner correctement

Qu'est-ce que dans ce contexte « multi-octets »? Une chaîne encodée en octets UTF-8? Un codage multi-octets spécifique aux paramètres régionaux, tel que GB?

Si vous n'utilisez pas des chaînes larges (Unicode) en mode natif, vous ne pouvez pas espérer plus de prise en charge des caractères non-ASCII que de simplement détecter leur présence. POSIX regex ne spécifie aucune classe de caractères pour les octets en dehors de la plage ASCII, donc il ne sait pas que l'un des octets dans "\ xe7 \ xb4 \ x99" (la représentation UTF-8 de '紙') pourrait être considéré lettres-mots; par conséquent, il ne voit aucune limite de mot. Ce qui constitue une lettre ou un mot dans Unicode est une question plus compliquée que la simple expression ASCII ASCII peut gérer. (. Et de toute évidence, ce qui constitue un « mot » en chinois est discutable en soi) Si tout ce que vous voulez détecter est vieux espaces simples, vous pouvez le faire explicitement:

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

Je voulais dire UTF-8 octets. J'ai réalisé tout à l'heure que métacaractère de limite de mot ne fonctionne que pour les classes de mots, ce qui signifie techniquement caractère alphanumérique plus _. Cela a fonctionné pour moi! Merci! =) –

0

Je pense que cela dépend de la bibliothèque/du langage de programmation que vous utilisez et de la configuration de votre bibliothèque RegExp. Vous devez probablement activer le support multi-octets, indiquer à la bibliothèque le codage de caractères que vous utilisez ou modifier les paramètres régionaux en conséquence. Certaines opérations spéciales comme \ b ou \ w dépendent de ces paramètres.

0

Voir this answer pour plus sur Unicode et mot limites. Les solutions proposées sont applicables à la bibliothèque PCRE, mais les principes devraient également s'appliquer à d'autres.

Questions connexes