4 votes

Regex - correspond si au moins 2 mots sur N mots, dans n'importe quel ordre

J'essaie de créer une expression regex qui créera une correspondance si une chaîne contient au moins 2 mots sur N. Par exemple, prenons les mots ('un', 'deux', 'trois', 'quatre'). Cette expression doit renvoyer une correspondance pour tous ces cas :

one two three four
twothreeone
two plus two is four

Il ne doit pas renvoyer de correspondance pour :

one
three plus three is three

J'ai essayé quelque chose comme ceci '/^(?=.*one)(?=.*two)(?=.*three)(?=.*four).+/' mais cela ne correspondra que si tous les mots ('one', 'two', 'three', 'four') sont contenues dans la chaîne.

2voto

cnst Points 1699

Je m'excuse d'avoir volé le commentaire de quelqu'un, mais il semble que cela fonctionne !

En Perl/PCRE, vous pouvez utiliser une référence à un sous-motif dans un groupe de capture avec (?n) où n est le numéro du groupe de capture. Ainsi : (un|deux|trois|quatre).*( ?! \1 )(?1). Dans le pire des cas, on n'a pas besoin de tout taper deux fois quand on connaît les raccourcis ctrl+c et ctrl+v - Casimir et Hippolyte Il y a 4 heures

% pcretest 
PCRE version 8.35 2014-04-04

  re> #(one|two|three|four).*(?!\1)(?1)#
data> one one one
No match
data> one two one
 0: one two
 1: one
data> one four
 0: one four
 1: one
data> four four
No match
data> ^D
%

En effet, en pcre qui est une bibliothèque populaire utilisée par nginx (la seule dépendance de l'ensemble du port nginx dans les ports OpenBSD !) et de nombreux autres logiciels, vous pouvez utiliser quelque chose comme (?1) (ou (?-1) ) pour faire référence au modèle précédent, afin d'éviter de devoir copier-coller plusieurs fois, ainsi que le look-ahead négatif, qui est tout à fait normal.

Voici la documentation sur les fonctionnalités en jeu - vous pouvez vous renseigner sur le programme pcrepattern y pcresyntax pages du manuel, sections comme ci-dessous :

etc.

En général, les http://www.pcre.org/original/pcre.txt y http://www.pcre.org/pcre2.txt comprennent une documentation complète et sont utiles pour rechercher la syntaxe que vous avez vue quelque part.

1voto

Bohemian Points 134107

Rechercher deux copies d'un mot cible, mais capturer la première et appliquer une anticipation négative sur le second mot en utilisant une référence arrière au premier groupe pour affirmer qu'un mot cible a été capturé. différents est apparu dans le deuxième groupe, soit (au moins) 2 au total.

(one|two|three|four).*(?!\1)(one|two|three|four)

S Démonstration en direct .

1voto

Kyle Fairns Points 2137
(one|two|three|four).*(?!\1)(?-1)

Explication :

  • Capturer un des mots du groupe
  • Trouver n'importe quel nombre de caractères
  • Si vous trouvez que ce qui a été mis en correspondance dans le dernier groupe n'est pas mis en correspondance
  • A moins que vous ne trouviez une autre correspondance du groupe un derrière celle-ci (sous-modèle récursif)

Cela signifie que lorsque vous le modifiez, vous ne pourrez modifier qu'un seul groupe de capture, en supposant que vous utilisiez les expressions rationnelles PCRE (avec PHP, par exemple).

Consultez le site démo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X