regex - Hvad betyder spørgsmålstegn som ?: og ?! i Javascript regexp?


Kan du lide regexp’en i denne? Hvad matcher den?

document.getElementById("MyElement").className = 
   document.getElementById("MyElement").className.replace
  ( /(?:^|\s)MyClass(?!\S)/ , '' )

Svar #1

?: betyder, at fangstgruppen bliver en ikke-fangende gruppe, dvs. inkluder ikke dens match som en tilbage-reference. Dette gøres ofte for at øge ydeevnen og rydde op i tilbage-referencerne, når en fangstgruppe er nødvendig for at bruge |-operatoren.

I dit eksempel bruges det til at tillade eller (|) i starten af strengen ^ eller mellemrum (\s). Da forfatteren af denne kode ikke er interesseret i, hvad det matchede, har de gjort det til en ikke-fangende gruppe.

?! er det negative lookahead. Regex'en vil kun matche, hvis den fangende gruppe ikke matcher.

I dette eksempel ønsker forfatteren at sikre, at tegnet efter MyClass ikke er et mellemrumstegn (\S).

Det er en smule muligt, at forfatteren af denne kode kunne have brugt ordgrænser i stedet (\b).

Svar #2

Regulære udtryk (?:^|\s) er en ikke-fangende gruppe, der matcher enten starten af linjen eller et mellemrumstegn.

Regulære udtrykket (?!\S) er en negativ fremadrettet påstand, som lykkes enten ved slutningen af strengen, eller når det næste tegn er et mellemrumstegn.