Question
Sur la base de cette réponse
expressions régulières: Y at-il un opérateur AND ? p>
J'ai essayé ce qui suit sur http://regexpal.com/ mais n'a pas pu le faire au travail. Qu'est-ce que je manque? Est-ce JAVASCRIPT pas le soutenir?
Regex: (?=foo)(?=baz)
Chaîne: foo,bar,baz
La solution
Il est impossible pour les (?=foo)
et (?=baz)
pour correspondre en même temps. Il faudrait le prochain caractère à la fois f
et b
simultanément ce qui est impossible.
Peut-être que vous voulez ceci:
(?=.*foo)(?=.*baz)
Ceci signifie que foo
doit apparaître en tout lieu et baz
doit apparaître nulle part, pas nécessairement dans cet ordre et éventuellement chevauchement (bien chevauchement n'est pas possible dans ce cas spécifique parce que les lettres elles-mêmes ne se chevauchent pas).
Autres conseils
Exemple d'une valeur booléenne (AND) ainsi que la recherche Wildcard, que je suis à l'aide à l'intérieur d'un plugin javascript Autocomplete:
Chaîne au match: "mon mot"
Chaîne à la recherche: « Je cherche mes mots drôles à l'intérieur de ce texte »
Vous avez besoin de regex suivant:
/^(?=.*my)(?=.*word).*$/im
Explication:
^ Position d'assertion au début d'une ligne
? = positif Lookahead
. * correspond à tout caractère (sauf nouvelle ligne)
() Groupes
$ Position assert à la fin d'une ligne
i modificateur: insensible. match insensible à la casse (ne tient pas compte des cas [a-zA-Z])
m modificateur : plusieurs lignes. Causes ^ et $ pour correspondre à la début / fin de chaque ligne (non seulement commencer / fin de chaîne)
Test de Regex ici: https://regex101.com/r/iS5jJ3/1
Ainsi, vous pouvez créer une fonction javascript qui:
- Remplacer les caractères réservés regex pour éviter les erreurs
- Divisez votre chaîne à espaces
- Encapsulate vos mots à l'intérieur des groupes regex
- Créer un motif regex
- 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>
Peut-être juste un OU |
de l'opérateur pourrait être suffisant pour votre problème:
Chaîne: foo,bar,baz
Regex: (foo)|(baz)
Résultat: ["foo", "baz"]
Peut-être vous cherchez quelque chose comme ça. Si vous souhaitez sélectionner la ligne complète quand il contient à la fois « foo » et « baz » en même temps, ce RegEx se conformera que:
.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*