1
votes

Terser RegExp pour attraper une collection d'alternatives de mots groupés

Je voudrais saisir les mots ferrari , ferry et ferret .

Le regex peut facilement être:

/ferr(ari|y|et)/

Cependant, j'ai remarqué un schéma: lorsque vous souhaitez capturer plusieurs alternatives d'un seul mot, vous pouvez utiliser le crochet carré [wordsToCapture] . Par exemple, je voudrais attraper les mots: voyelle a , voyelle e , voyelle u , voyelle o , voyelle i .

Le regex peut être: voyelle [aeiou] qui a moins de bruit que voyelle (a | e | i | o | u)

J'ai donc essayé d'utiliser le crochet carré pour attraper plusieurs alternatives de mots groupés . Cependant, le [...] (crochet carré) rend mon groupe de capture (le crochet rond (...) ) inutile, c'est-à-dire si j'utilise cette expression régulière ferr [(ari) (y) (et)] , il correspondra à la place: ferr (, ferra , ferrr , ferri , et la liste continue pour chaque un des caractères présentés entre crochets .

Y a-t-il un moyen de faire en sorte que les crochets du groupe de capture à l'intérieur de mon crochet pour conserver sa signification particulière, rendant ainsi mon RegExp terser? Ou y a-t-il un autre moyen de le rendre terser?


3 commentaires

Pourriez-vous expliquer pourquoi ferr (ari | y | et) ne répondrait pas à vos besoins? Il y a quelques choses que vous pouvez faire pour regex, mais [] sert généralement à une énumération d'options, de jeux de caractères et de plages de caractères uniques. Quels sont les besoins que vous ne pouvez pas répondre avec l'expression régulière ci-dessus?


@SebastienDufresne Je n'ai pas dit que cela ne correspondait pas à mes besoins. Je me demande simplement s'il existe un moyen plus court de traiter ce qui précède.


Pas vraiment, vous pouvez faire quelque chose comme: / ferr [aey] [rt]? I? / si vous voulez vraiment les éviter. ;-) Mais cela entraînerait beaucoup de faux positifs possibles. :)


3 Réponses :


1
votes

Non - les crochets indiquent un jeu de caractères. Si vous souhaitez faire correspondre plusieurs groupes de lettres, vous devez utiliser la notation que vous utilisiez auparavant.

/ferr(ari|y|et)/


0 commentaires

1
votes

Comme Jack l'a mentionné, les crochets ne peuvent pas être utilisés de cette manière, mais SI vous rencontrez des problèmes avec les parenthèses, pour une raison quelconque, vous avez encore quelques options.

Celui qui peut être utile à savoir, si vous en avez besoin, est celui qui n'est pas capturant, comme ceci:

/ ferr (?: ari | y | et) /

Il y a une belle explication ici .


1 commentaires

Oh, c'est une bonne chose à savoir, bien que sans rapport avec ma question. Merci quand même.



-1
votes

Techniquement, il existe des moyens de le faire, mais cela peut ne pas être nécessaire, selon ce que nous souhaitons accomplir:

ferr([a][r][i]|[e][t]|[y])
ferr(ari|et|y)

Démo 1

D'autres exemples sont:

ferr[ar]?[i]?[y]?[e]?[t]?
ferr[ar]?[iy]?[e]?[t]?
ferr[ar]?[iy]?[et]?

Pour ferrari , ferret et ferry , en utilisant char class , ce serait possible, mais excessif:

ferr[a]?[r]?[i]?[y]?[e]?[t]?

Démo


2 commentaires

Cela rendrait ferrariyet capturable aussi, cependant.


Cela n'est pas souhaitable. Je veux seulement capturer ferrari , ferret et ferry , pas tous les mots combinés.