Maison >Java >javaDidacticiel >Quels sont les équivalents Unicode pour \w et \b de Java dans les expressions régulières ?

Quels sont les équivalents Unicode pour \w et \b de Java dans les expressions régulières ?

DDD
DDDoriginal
2024-12-13 14:55:14557parcourir

What are the Unicode-aware equivalents for Java's w and b in regular expressions?

Équivalents Unicode pour w et b dans les expressions régulières Java ?

Les expressions rationnelles Java ont des raccourcis de classe de caractères limités (w et b) par rapport aux autres implémentations modernes de regex. En Java, w correspond uniquement à [A-Za-z0-9_], ce qui limite les capacités de correspondance de mots. De plus, la sémantique des limites des mots de b s'écarte des définitions de w et d'Unicode.

Équivalents compatibles Unicode

Heureusement, des équivalents personnalisés compatibles Unicode ont été développés pour surmonter ces limitations. . Voici les remplacements :

\s: [\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]
\S: [^\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]

\v: [\u000A-\u000D\u0085\u2028\u2029]
\V: [^\u000A-\u000D\u0085\u2028\u2029]

\h: [\u0009\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]
\H: [^\u0009\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]

\w: [\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]]
\W: [^\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&&\p{So}]]

\b: (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]]))
\B: (?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics">&amp;&amp;\p{So}]]))

\d: \p{Nd}
\D: \P{Nd}

\R: (?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])
\X: (?>\PM\pM*)

Comprendre les limites (b et B)

Les limites correspondent aux positions où les caractères de mots passent aux caractères non-mots ou vice versa. Une limite est définie comme :

IF follows word
THEN doesn't precede word
ELSIF doesn't follow word
THEN does precede word

Traduit en syntaxe regex :

(?:(?<=\w)(?!\w)|(?<!\w)(?=\w))

De même, l'équivalent non-frontière (B) est :

(?:(?<=\w)(?=\w)|(?<!\w)(?!\w))

Incorporation du support Unicode dans Java

Pour incorporer ces équivalents Unicode dans votre Java regex, vous pouvez utiliser une fonction de réécriture de chaîne pour transformer le modèle avant la compilation. Voici un exemple utilisant une fonction personnalisée appelée rewrite :

String rewrittenPattern = rewrite(originalPattern);
Pattern compiledPattern = Pattern.compile(rewrittenPattern);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn