Une expression régulière \ b
-
12-09-2019 - |
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.
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 »