Hoe een specifieke stringconstante uitsluiten?

Kan reguliere expressie worden gebruikt om elke tekenreeks te matchen, behalve een specifieke tekenreeksconstante (d.w.z. "ABC")?

Is het mogelijk om slechts één specifieke tekenreeksconstante uit te sluiten?


Antwoord 1, autoriteit 100%

Je moet een negatieve vooruitblik-bewering gebruiken.

(?!^ABC$)

U kunt bijvoorbeeld het volgende gebruiken.

(?!^ABC$)(^.*$)

Als dit niet werkt in uw editor, probeer dit dan. Het is getest om te werken in ruby en javascript:

^((?!ABC).)*$

Antwoord 2, autoriteit 4%

Dit is niet eenvoudig, tenzij je regexp-engine er speciale ondersteuning voor heeft. De eenvoudigste manier is om een optie voor een negatieve overeenkomst te gebruiken, bijvoorbeeld:

$var !~ /^foo$/
    or die "too much foo";

Zo niet, dan moet je iets slechts doen:

$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
    or die "too much foo";

Die zegt eigenlijk “als het begint met niet-f, kan de rest van alles zijn; als het begint met f, niet-o, de rest kan van alles zijn; anders, als het fobegint, kan het volgende teken beter geen andere ozijn”.


Antwoord 3, autoriteit 3%

Je zou een negatieve vooruitblik kunnen gebruiken, of zoiets:

^([^A]|A([^B]|B([^C]|$)|$)|$).*$

Misschien kan het wat vereenvoudigd worden.


Antwoord 4, autoriteit 3%

In .NET kun je groeperen als volgt in je voordeel gebruiken:

http://regexhero.net/tester/?id= 65b32601-2326-4ece-912b-6dcefd883f31

Je zult merken dat:

(ABC)|(.)

Pak alles behalve ABC in de 2e groep. Haakjes omringen elke groep. Dus (ABC) is groep 1 en (.) is groep 2.

Dus je pakt de 2e groep gewoon zo in een vervanging:

$2

Of kijk in .NET naar de Groups-verzameling in de Regex-klasse voor wat meer controle.

Je zou in de meeste andere regex-implementaties ook iets soortgelijks moeten kunnen doen.

UPDATE: ik heb hier een veel snellere manier gevonden om dit te doen:
http://regexhero.net/tester/?id=997ce4a2-878c -41f2-9d28-34e0c5080e03

Het maakt nog steeds gebruik van groepering (ik kan geen manier vinden die geen groepering gebruikt). Maar deze methode is meer dan 10x sneller dan de eerste.


Antwoord 5, autoriteit 2%

Probeer deze reguliere expressie:

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$

Het beschrijft drie gevallen:

  1. minder dan drie willekeurige tekens
  2. exact drie tekens, terwijl ofwel
    • de eerste is niet A, of
    • de eerste is Amaar de tweede is niet B, of
    • de eerste is A, de tweede Bmaar de derde is niet C
  3. meer dan drie willekeurige tekens

Other episodes