2011-12-06 19 views
9

I nie wydaje się dowiedzieć się, jak komponować wyrażenie regularne (używany w JavaScript), który wykonuje następujące czynności:Wyrażenie regularne negatywne mecz

dopasować wszystkie ciągi znaków, gdzie po 4 charakterze nie zawierają „GP ".

Niektóre przykładowe ciągi:

  • EDAR - pasuje!
  • EDARGP - nie pasuje
  • EDARDTGPRI - nie pasuje
  • ECMRNL - mecz

ja bym miłość pomocy tutaj ...

+0

Zjadłbym pierwsze cztery postacie, a następnie poszukam lekarza ogólnego. Czy tutaj konieczne jest wyrażenie regularne? Dlaczego nie zrobić czegoś takiego jak "EDARGP" .slice (4) .indexOf ("GP") == -1'? – JesseBuesking

+0

To może zadziałać, tyle że nie mogę zmienić "kodu", mogę zmienić tylko ciąg regex, ponieważ kod musi działać z kilkoma rodzajami wartości wejściowych –

Odpowiedz

11

Stosować zerowej szerokości twierdzenia:

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

Objaśnienie:

" 
^  # 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 
) 
" 
+1

Skąd masz to wyjaśnienie? Wygląda na wygenerowaną automatycznie, w tym przypadku chciałbym wiedzieć, jakiego narzędzia używasz. – Bart

+1

@Bart Regexbuddy :) – FailedDev

+0

Dzięki @FailedDev! – Bart

7

Można wykorzystać to, co nazywa się ujemne uprzedzona zapewnianie tutaj. Sprawdza ciąg znaków przed lokalizacją i dopasowuje tylko wtedy, gdy wzorzec zawarty jest/nie/znaleziony. Oto przykład, wyrażenie regularne:

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

ta pasuje tylko wtedy, gdy po pierwszych czterech znaków, ciąg GP nie znaleziono.

+2

Wygrałeś wyścig. :) +1 – FailedDev

+0

Dzięki, to działa. Po prostu nie jestem pewien, co "?!" część robi ... –

2

mógłby zrobić coś takiego:

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

Test zwróci true dla meczów i false nie.

+0

Ładna alternatywa. +1. – FailedDev

+1

@FailedDev dzięki, ale oczywiście ty i Dan masz poprawną odpowiedź: P ładnie wykonane. –

+0

Czy my? Twoje rozwiązanie jest prawdopodobnie szybsze i nie wspomina o prostszych :) – FailedDev