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
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).
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:
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>
Vous avez besoin d'un opérateur OR |
:
Chaîne: foo,bar,baz
Regex: (foo)|(baz)
Résultat: ["foo", "baz"]