javascript regex - alternativ til look behind?


Her er et regex som fungerer fint i de fleste regex-implementasjoner:

(?<!filename)\.js$

Dette matcher .js for en streng som slutter med .js bortsett fra filename.js

Javascript har ikke regex lookbehind. Er det noen som kan sette sammen et alternativt regex som oppnår samme resultat og fungerer i javascript?

Her er noen tanker, men trenger hjelpefunksjoner. Jeg håpet å oppnå det bare med en regex: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

Svar #1

REDIGER: Fra og med ECMAScript 2018 støttes lookbehind-asserteringer (selv ubegrensede) nativt.

I tidligere versjoner kan du gjøre dette:

^(?:(?!filename\.js$).)*\.js$

Dette gjør eksplisitt det som lookbehind-uttrykket gjør implisitt: sjekker hvert tegn i strengen om lookbehind-uttrykket pluss regex-en etter det ikke vil matche, og tillater bare da at det tegnet matcher.

^                 # Start of string
(?:               # Try to match the following:
 (?!              # First assert that we can't match the following:
  filename\.js    # filename.js 
  $               # and end-of-string
 )                # End of negative lookahead
 .                # Match any character
)*                # Repeat as needed
\.js              # Match .js
                # End of string

En annen redigering:

Det gjør vondt å si (spesielt siden dette svaret har fått så mange stemmer) at det finnes en mye enklere måte å oppnå dette målet på. Det er ikke nødvendig å sjekke fremtiden ved hver karakter:

^(?!.*filename\.js$).*\.js$

fungerer like godt:

^                 # Start of string
(?!               # Assert that we can't match the following:
 .*               # any string, 
  filename\.js    # followed by filename.js
  $               # and end-of-string
)                 # End of negative lookahead
.*                # Match any string
\.js              # Match .js
                # End of string

Svar #2

^(?!filename).+\\.js fungerer for meg

testet mot:

  • test.js kamp
  • blabla.js kamp
  • filename.js ingen treff

En ordentlig forklaring på dette regexet kan finnes på Regular expression to match string not containing a word?

Look ahead er tilgjengelig siden versjon 1.5 av JavaScript og støttes av alle store nettlesere

Oppdatert for å samsvare med filename2.js og 2filename.js, men ikke filename.js

(^(?!filename\.js$).).+\.js

Svar #3

La oss anta at du vil finne alle int som ikke er forutgått av unsigned:

Med støtte for negativ tilbakeblikk:

(?<!unsigned )int

Uten støtte for negativ bakoverkikk:

((?!unsigned ).{9}|^.{0,8})int

Grunnideen er å ta n foregående tegn og utelate treff med negativ frempek, men også matche tilfellene der det ikke finnes n foregående tegn. (der n er lengden på look-behind).

Så regexen det gjelder:

(?<!filename)\.js$

vil oversettes til:

((?!filename).{8}|^.{0,7})\.js$

Du kan trenge å leke med fangstgrupper for å finne den eksakte delen av strengen som interesserer deg, eller du vil erstatte en spesifikk del med noe annet.

Relaterte artikler