Comment le composant d'expression régulière '[^][]' fonctionne-t-il pour faire correspondre les crochets imbriqués ?

Susan Sarandon
Libérer: 2024-11-07 07:03:02
original
580 Les gens l'ont consulté

How does the

Que signifie l'expression régulière "[^][]" ?

Dans l'expression régulière fournie :

\[(?:[^][]|(?R))*\]
Copier après la connexion

le composant regex "[^][]" est une classe de caractères qui correspond à n'importe quel caractère sauf "[" ou "]".

Explication de la classe de caractères

A La classe de caractères correspond à n'importe quel caractère dans la plage de caractères donnée. Dans ce cas, "[^]" signifie "non suivi de ]", donc "[^][]" correspond effectivement à tout caractère qui n'est pas suivi de "]".

Récursion Regex

Les parenthèses autour de "[^][]" indiquent un groupe non capturant. À l'intérieur du groupe, le jeton « ?R » représente une référence récursive à l'intégralité de l'expression régulière. Cela permet à l'expression régulière de correspondre aux crochets imbriqués.

Éviter les séquences d'échappement

Notez que, dans PCRE (le moteur d'expression régulière utilisé par les fonctions preg_ de PHP), ce n'est pas nécessaire pour échapper "[" ou "]" dans une classe de caractères. En effet, il est sans ambiguïté que le "]" dans "[^][]" appartient à la classe de caractères.

Modificateur xx en ligne (PHP 7.3)

Dans PHP 7.3, vous pouvez utiliser le modificateur xx en ligne pour ignorer les caractères vides dans les classes de caractères. Cela vous permet d'écrire les classes moins ambiguës suivantes :

(?xx) [^ ][ ]     [ ] ]      [ [ ]      [^ [ ]
Copier après la connexion

Compatibilité et bizarreries

La syntaxe "[^][]" est compatible avec la plupart des versions d'expressions régulières. , notamment PCRE, Perl, Python, Java et autres. Cependant, il n'est pas reconnu dans Ruby et JavaScript (sauf dans les anciennes versions d'Internet Explorer).

Correspondance entre crochets imbriqués

Dans le contexte de votre exemple d'expression régulière, "[^][]" garantit que les crochets équilibrés correspondent, ce qui permet la correspondance des crochets imbriqués.

Remarques supplémentaires

  • "[^ ]]" est sans ambiguïté car "[^]" correspond à des caractères non suivis de "]", donc le "]" suivant appartient à la classe de caractères.
  • Les navigateurs JavaScript modernes suivent généralement la spécification ECMA, qui définit " []" comme jeton d'expression régulière qui ne correspond toujours pas.
  • L'expression régulière optimisée fournie "([[^][](?:(?-1)[^][] )* ])" améliore les performances en évitant les alternances inutiles.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!