Question

Sur la base de cette réponse

expressions régulières: Y at-il un opérateur AND

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

Était-ce utile?

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:

  1. Remplacer les caractères réservés regex pour éviter les erreurs
  2. Divisez votre chaîne à espaces
  3. Encapsulate vos mots à l'intérieur des groupes regex
  4. Créer un motif 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>

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)+.*

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top