Question

Je suis en train d'écrire des expressions régulières pour le texte unicode en Java. Toutefois, pour le script particulier que j'utilise - Devanagari (0900 - 097F) il y a un problème avec les limites de mots. \ B correspond à des caractères qui sont dépendantes des voyelles (comme 093E-094C), car ils sont traités comme des espaces.

Exemple: Supposons que j'ai la chaîne: « कमल कमाल कम्हल कम्हाल » Notez que « मा » dans le 2ème mot est formé en combinant म et ा (reconnu comme un espace). De même, dans le dernier mot. Cela conduit \ b pour correspondre à la « ल » avec une expression régulière « कमाल » \ b \ w \ b qui est incorrect en fonction de la langue.

J'espère que l'exemple aide.

Puis-je écrire une expression régulière qui se comporte comme \ b, mais il ne correspond pas à certains caractères? Tous les commentaires seront reconnaissants.

Était-ce utile?

La solution

Vous devriez être en mesure d'accomplir ce que vous voulez avec les opérateurs regex suivants:

(?=X)   X, via zero-width positive lookahead
(?!X)   X, via zero-width negative lookahead
(?<=X)  X, via zero-width positive lookbehind
(?<!X)  X, via zero-width negative lookbehind

(ci-dessus est cité de la Java 6 API Pattern docs .)

Utilisation (?<![foo])(?=[foo]) à la place de \b avant un mot, et (?<=[foo])(?![foo]) à la place de \b après un mot, où « [foo] » est votre jeu de caractères « mot »

Autres conseils

L'équivalent pour les limites de mots (si les limites ne sont pas ce que vous attendiez pour) serait:

 (?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])

C'est parce qu'une « limite de mot » signifie « un endroit où il y a un personnage d'un côté et pas de l'autre)

Donc, avec regarder en arrière et d'anticipation des expressions, vous pouvez définir votre propre classe de caractères [x-y] pour vérifier si vous voulez isoler une « limite de mot »

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top