web-dev-qa-db-fra.com

Regex et opérateur

Basé sur cette réponse

Expressions régulières: Y a-t-il un opérateur AND?

J'ai essayé ce qui suit sur http://regexpal.com/ mais n'ai pas réussi à le faire fonctionner. Qu'est-ce qui me manque? Javascript ne le supporte-t-il pas?

Regex: (?=foo)(?=baz)

Chaîne: foo,bar,baz

34
user366735

Il est impossible que (?=foo) et (?=baz) correspondent en même temps. Il faudrait que le caractère suivant soit à la fois f et b simultanément, ce qui est impossible.

Peut-être que vous voulez cela à la place:

(?=.*foo)(?=.*baz)

Cela signifie que foo doit apparaître n'importe où et baz doit apparaître n'importe où, pas nécessairement dans cet ordre et éventuellement en chevauchement (bien que le chevauchement ne soit pas possible dans ce cas particulier).

65
Mark Byers

Exemple de recherche booléenne (AND) plus Wildcard, que j'utilise dans un plugin javascript Autocomplete:

Chaîne pour correspondre: "ma parole"

Chaîne de recherche: "Je cherche mes mots amusants dans ce texte"

Vous avez besoin de la regex suivante: /^(?=.*my)(?=.*Word).*$/im

Expliquant:

^ affirmer sa position au début d'une ligne

? = Lookahead positif

. * correspond à n'importe quel caractère (sauf la nouvelle ligne)

() Groupes

$ affirmer sa position en fin de ligne

i modificateur: insensible. Correspondance insensible à la casse (ignore la casse de [a-zA-Z])

m modificateur: multiligne. Fait en sorte que ^ et $ correspondent au début/à la fin de chaque ligne (pas seulement au début/à la fin de la chaîne)

Testez le Regex ici: https://regex101.com/r/iS5jJ3/1

Vous pouvez donc créer une fonction javascript qui:

  1. Remplacez les caractères réservés regex pour éviter les erreurs
  2. Divisez votre chaîne en espaces
  3. Encapsulez vos mots dans des groupes de regex
  4. Créer un motif de regex
  5. Exécuter le match regex

Exemple:

function fullTextCompare(myWords, toMatch){
    //Replace regex reserved characters
    myWords=myWords.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    //Split your string at spaces
    arrWords = myWords.split(" ");
    //Encapsulate your words inside regex groups
    arrWords = $.map( arrWords, function( n ) {
        return ["(?=.*"+n+")"];
    });
    //Create a regex pattern
    sRegex = new RegExp("^"+arrWords.join("")+".*$","im");
    //Execute the regex match
    return(toMatch.match(sRegex)===null?false:true);
}

//Using it:
console.log(
    fullTextCompare("my Word","I'm searching for my funny words inside this text")
);

//Wildcards:
console.log(
    fullTextCompare("y wo","I'm searching for my funny words inside this text")
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

7
Marcelo Amorim

Vous avez besoin d'un opérateur OR |:

Chaîne: foo,bar,baz

Regex: (foo)|(baz)

Résultat: ["foo", "baz"]

5
paulequilibrio