Regex AND-operator

Op basis van dit antwoord

Reguliere expressies: is er een AND-operator?

Ik heb het volgende geprobeerd op http://regexpal.com/maar kreeg het niet werkend. Wat mis ik? Ondersteunt javascript het niet?

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

String: foo,bar,baz


Antwoord 1, autoriteit 100%

Het is onmogelijk dat zowel (?=foo)als (?=baz)tegelijkertijd overeenkomen. Het volgende teken zou dan zowel fals bmoeten zijn, wat onmogelijk is.

Misschien wil je dit in plaats daarvan:

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

Hier staat dat foooveral moet verschijnen en bazoveral moet verschijnen, niet noodzakelijk in die volgorde en mogelijk overlappend (hoewel overlap in dit specifieke geval niet mogelijk is omdat de letters zelf overlappen elkaar niet).


Antwoord 2, autoriteit 21%

Voorbeeld van een Boolean (AND) plus Wildcard-zoekopdracht, die ik gebruik in een javascript Autocomplete-plug-in:

Overeenkomende tekenreeks: "my word"

Tekenreeks om te zoeken: "I'm searching for my funny words inside this text"

Je hebt de volgende regex nodig: /^(?=.*my)(?=.*word).*$/im

Uitleggen:

^positie bevestigen aan het begin van een regel

?=Positieve vooruitzichten

.*komt overeen met elk teken (behalve nieuwe regel)

()Groepen

$positie bevestigen aan het einde van een regel

imodifier: ongevoelig. Hoofdletterongevoelige overeenkomst (negert hoofdletters van [a-zA-Z])

mmodifier: meerdere regels. Zorgt ervoor dat ^ en $ overeenkomen met het begin/einde van elke regel (niet alleen het begin/einde van de tekenreeks)

Test de Regex hier: https://regex101.com/r/iS5jJ3/1

U kunt dus een javascript-functie maken die:

  1. Vervang door regex gereserveerde tekens om fouten te voorkomen
  2. Spreek je string op met spaties
  3. Voeg uw woorden toe in regex-groepen
  4. Maak een regex-patroon
  5. Voer de regex-overeenkomst uit

Voorbeeld:

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 = arrWords.map(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")
);

Antwoord 3

Misschien is alleen een OR-operator |voldoende voor uw probleem:

String: foo,bar,baz

Regex: (foo)|(baz)

Resultaat: ["foo", "baz"]


Antwoord 4

Misschien ben je op zoek naar zoiets. Als u de volledige regel wilt selecteren wanneer deze zowel “foo” als “BAZ” tegelijkertijd bevat, zal deze regex eraan voldoen:

.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*

Other episodes