10
votes

Quelle est la différence entre () et [] dans une regex?

Disons:

/ (a ​​| b) / vs / [ab] /


0 commentaires

3 Réponses :


21
votes

Il n'y a pas beaucoup de différence dans votre exemple ci-dessus (dans la plupart des langues). La différence majeure est que la version () code> crée un groupe qui peut être redressé par \ 1 code> dans la correspondance (ou, parfois, 1 $ code>) . La version [] code> ne fait pas cela.

Aussi, P>

/(ab|cd)/  # matches 'ab' or 'cd'
/[abcd]/   # matches 'a', 'b', 'c' or 'd'


6 commentaires

() sont également utilisés pour désigner des groupes nommés, pour la réutilisation


@rexem - Yep, pensa à ce sujet avant votre commentaire et édité-le :)


Nope, c'est un point important - en fait, c'est la raison principale que j'utiliserais (a | b) au lieu de [ab] .


@xu pas du tout. (a-z) correspond à la littérale "A-Z" et crée un groupe; [A-Z] correspond à une lettre minuscule (unique) (de A-Z).


:-) pensais autant .. et est une autre différence entre () et [] .. (Titre des questions et corps demandez-vous quelque chose de légèrement différent (


-1 parce que ce premier bit ("il n'y a pas beaucoup de différence") est très trompeur. Comme la partie "aussi" de la réponse précise clairement, il existe une énorme différence entre () et [] (bien que cela n'affecte pas la question initiale de Cheng).



6
votes

Premièrement, lorsque vous parlez de Regexes, il est souvent important de spécifier le type de regex dont vous parlez. Il existe plusieurs variantes (telles que les regexnes de POSIX traditionnelles, PERL et PERL-compatibles (PCRE), etc.).

En supposant que la PCRE ou quelque chose de très similaire, ce qui est souvent le plus courant de nos jours, il existe trois différences essentielles:

  1. Utilisation de groupes entre parenthèses, vous pouvez vérifier les options constituées de plusieurs caractères. Donc / (a ​​| b) / pourrait plutôt être / (abc | défens) /.
  2. Les groupes entre parenthèses effectuent une opération de capture afin que vous puissiez extraire le résultat (de sorte que s'il correspondait sur "B", vous pouvez obtenir "B" de retour et voir cela). / [ab] / ne le fait pas. L'opération de capture peut être remplacée par l'ajout ?: Comme: / (?: A | B) /
  3. Même si vous remplissez le comportement de capture des parenthèses, la mise en œuvre sous-jacente peut encore être plus rapide pour [] lorsque vous vérifiez des caractères uniques (bien que rien n'indique non-capture (?: A | B) ne peut pas être optimisé comme Un cas particulier dans [AB], mais la compilation de regex peut prendre si légèrement plus longue).

0 commentaires

7
votes

() dans une expression régulière est utilisé pour regrouper des expressions régulières, vous permettant d'appliquer des opérateurs à une expression entière plutôt qu'un seul caractère. Par exemple, si j'ai l'expression régulière AB , alors ab * fait référence à un A suivi d'un nombre quelconque de B S (par exemple, A , AB , ABB , etc.), tandis que (AB) * se réfère à n'importe quel nombre de répétitions de la séquence AB (par exemple, la chaîne vide, AB , abab , etc.). Dans de nombreux moteurs d'expression réguliers, () sont également utilisés pour créer des références pouvant être mentionnées après la correspondance. Par exemple, dans Ruby, après avoir exécuté "foo" = ~ / f (o *) / , 1 $ contiendra oo .

| dans une expression régulière indique une alternance; Cela signifie l'expression avant la barre ou l'expression après. Vous pouvez correspondre à n'importe quel chiffre avec l'expression 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 . Vous verrez fréquemment une alternance enveloppée dans un ensemble de parenthèses aux fins de regroupement ou de capture d'une sous-expression, mais ce n'est pas nécessaire. Vous pouvez également utiliser une alternance sur des expressions plus longues également, comme FOO | BAR , pour indiquer soit FOO ou bar . .

Vous pouvez exprimer toutes les expressions régulières (dans le sens formel, théorique, pas le sens étendu que de nombreuses langues utilisent), avec juste alternance | , kleene fermeture * , Concaténation (il suffit d'écrire deux expressions à côté de l'autre avec rien entre les deux) et des parenthèses pour le groupement. Mais ce serait plutôt gênant pour des expressions compliquées, de sorte que plusieurs abrégées sont couramment disponibles. Par exemple, x? est juste un raccourci pour | x (c'est-à-dire la chaîne vide ou x ), tandis que y + < / code> est un raccourci pour yy * .

[] est fondamentalement un raccourci pour l'alternance | de tous les caractères ou de toutes les gammes de caractères, en informatique. Comme je l'ai dit, je pouvais écrire 0 | 1 | 3 | 4 | 5 | 6 | 7 | 7 | 9 , mais il est beaucoup plus pratique d'écrire [0-9] . Je peux aussi écrire [a-za-z] pour représenter n'importe quelle lettre. Notez que, tandis que [] fournit un regroupement, ils ne présentent généralement pas une nouvelle référence qui peut être évoquée ultérieurement; Vous devriez les envelopper entre parenthèses pour cela, comme ([a-za-z])

Ainsi, vos deux exemples d'expressions régulières sont équivalents dans ce qu'ils correspondent, mais le (a | b) définira la première sous-correspondance au caractère correspondant, tandis que [AB] ne créera aucune référence à des sous-correspondances.


0 commentaires