Negatieve overeenkomst voor reguliere expressie

Ik kan er niet achter komen hoe ik een reguliere expressie (gebruikt in Javascript) kan samenstellen die het volgende doet:

Overeenkomen met alle tekenreeksen waarbij de tekens na het vierde teken geen "GP" bevatten.

Enkele voorbeeldreeksen:

  • EDAR - overeenkomst!
  • EDARGP - geen overeenkomst
  • EDARDTGPRI - geen overeenkomst
  • ECMRNL - overeenkomst

Ik zou graag hier wat hulp ...

9
Ik zou de eerste vier karakters consumeren en dan naar de huisarts zoeken. Is een regex hier zelfs nodig? Waarom niet zoiets doen als "EDARGP" .slice (4) .indexOf ('GP') == -1 ?
toegevoegd de auteur JesseBuesking, de bron
Dat zou kunnen werken, behalve dat ik de "code" niet kan veranderen, ik kan alleen de regex-string veranderen, omdat de code met verschillende soorten invoerwaarden moet werken
toegevoegd de auteur Tjeerd Kramer, de bron

3 antwoord

Gebruik zero-width-assertions:

if (subject.match(/^.{4}(?!.*GP)/)) {
   //Successful match
}

Verklaring:

"
^        # Assert position at the beginning of the string
.        # Match any single character that is not a line break character
   {4}   # Exactly 4 times
(?!      # Assert that it is impossible to match the regex below starting at this position (negative lookahead)
   .     # Match any single character that is not a line break character
      *  # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   GP    # Match the characters “GP” literally
)
"
11
toegevoegd
@Bart Regexbuddy :)
toegevoegd de auteur FailedDev, de bron
@ user1084524 Negatieve lookahead-bewering. Gecombineerd met. * Controleer of ergens na het eerste vier teken GP is. Verwijder ook de $ aan het einde. Was een typfout.
toegevoegd de auteur FailedDev, de bron
Hoe heb je deze uitleg gekregen? Het ziet er automatisch gegenereerd uit, in welk geval ik graag zou willen weten welke tool je hebt gebruikt.
toegevoegd de auteur Bart, de bron
Bedankt @ FailedDev!
toegevoegd de auteur Bart, de bron
Bedankt voor de toegevoegde uitleg. Nog steeds niet helemaal zeker wat de "?!" deel doet het wel ...
toegevoegd de auteur Tjeerd Kramer, de bron

Je kunt hier een zogenaamde negatieve lookahead-bewering gebruiken. Het kijkt naar de tekenreeks die voor de locatie ligt en komt alleen overeen als het opgenomen patroon/niet/gevonden is. Hier is een voorbeeld van een reguliere expressie:

/^.{4}(?!.*GP)/

Dit komt alleen overeen als na de eerste vier tekens de tekenreeks GP niet wordt gevonden.

7
toegevoegd
Jij hebt de race gewonnen. :) +1
toegevoegd de auteur FailedDev, de bron
Bedankt, dit werkt. Gewoon niet zeker wat de "?!" deel doet ...
toegevoegd de auteur Tjeerd Kramer, de bron

kan zoiets als dit doen:

var str = "EDARDTGPRI";
var test = !(/GP/.test(str.substr(4)));

test retourneert true voor overeenkomsten en false voor niet.

2
toegevoegd
Dit is de meest efficiënte oplossing. Regexen zijn traag.
toegevoegd de auteur Dan, de bron
Leuk alternatief. 1.
toegevoegd de auteur FailedDev, de bron
Doen we? Uw oplossing is waarschijnlijk sneller en niet te vergeten: eenvoudiger :)
toegevoegd de auteur FailedDev, de bron
@FailedDev bedankt maar natuurlijk hebben jij en Dan het juiste antwoord: P mooi gedaan.
toegevoegd de auteur Joseph Marikle, de bron
Dit werkt, maar niet in mijn scenario. De regex-reeks is een variabele en de code zou met alle regexes moeten werken. Het wijzigen van de code is geen optie. Toch bedankt!
toegevoegd de auteur Tjeerd Kramer, de bron