Disons: P>
/ (a | b) / code> vs / [ab] / code> p>
3 Réponses :
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 Aussi, P> () 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. /(ab|cd)/ # matches 'ab' or 'cd'
/[abcd]/ # matches 'a', 'b', 'c' or 'd'
() 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) code> au lieu de [ab] code>.
@xu pas du tout. (a-z) code> correspond à la littérale "A-Z" et crée un groupe; [A-Z] CODE> 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).
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.). P>
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: p>
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 Ainsi, vos deux exemples d'expressions régulières sont équivalents dans ce qu'ils correspondent, mais le () code> 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 code>, alors ab * code> fait référence à un A code> suivi d'un nombre quelconque de B Code> S (par exemple, A code>, AB code>, ABB code>, etc.), tandis que (AB) * code> se réfère à n'importe quel nombre de répétitions de la séquence AB code> (par exemple, la chaîne vide, AB code>, abab code>, etc.). Dans de nombreux moteurs d'expression réguliers, () code> 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 *) / code>, 1 $ code> contiendra oo code>. p>
| code> 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 code>. 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 CODE>, pour indiquer soit FOO code> ou bar code>. P>.
| code>, kleene fermeture * code>, 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? Code> est juste un raccourci pour | x code> (c'est-à-dire la chaîne vide ou x code>), tandis que y + < / code> est un raccourci pour yy * code>. p>
[] code> est fondamentalement un raccourci pour l'alternance | code> 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 code>, mais il est beaucoup plus pratique d'écrire [0-9] code >. Je peux aussi écrire [a-za-z] code> pour représenter n'importe quelle lettre. Notez que, tandis que [] code> 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]) code> p>
(a | b) code> définira la première sous-correspondance au caractère correspondant, tandis que [AB] code> ne créera aucune référence à des sous-correspondances. P>