RegEx išskirti tam tikrą eilutės konstantą

Ar galima naudoti įprastą išraišką, kad atitiktų bet kurią eilutę, išskyrus konkrečią eilutės konstantą, tarkim, „ABC“? Ar galima išskirti tik vieną konkrečią eilutę? Ačiū už pagalbą iš anksto.

72
08 сент. rinkinys V Govind 08 sept. 2009-09-08 20:18 '09 ne 20:18 2009-09-08 20:18
@ 5 atsakymai

Turite naudoti neigiamą pareiškimą.

 (?!^ABC$) 

Galite naudoti, pavyzdžiui, toliau nurodytus.

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

Jei redaktoriuje tai neveikia, pabandykite. Jis yra išbandytas dirbti rubinu ir javascript:

 ^((?!ABC).)*$ 
92
08 сент. Atsakyti Daniel Brückner Rgs 08 2009-09-08 20:28 '09 ne 20:28 2009-09-08 20:28

Tai nėra lengva, jei jūsų regexp mechanizmas neturi daug paramos. Lengviausias būdas yra naudoti neigiamą atitikties parametrą, pavyzdžiui:

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

Jei ne, turite daryti kažką blogio:

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

Iš esmės jis sako: "jei jis prasideda ne f , poilsio gali būti bet koks: jei jis prasideda f , o ne o , likusi dalis gali būti bet kokia, kitaip, jei prasideda, kitas simbolis yra geriau ne būti kitoks".

4
08 сент. deroberto atsakymas 08.09. 2009-09-08 20:26 '09 ne 20:26 2009-09-08 20:26

Galite naudoti neigiamą „lookahead“ arba kažką panašaus:

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

Galbūt tai gali būti šiek tiek supaprastinta.

3
08 сент. atsakymą pateikė Adam Crume 08 sep . 2009-09-08 20:31 '09 ne 20:31 2009-09-08 20:31

Išbandykite šią įprastą išraišką:

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

Jis apibūdina tris atvejus:

  • mažiau nei trys savavališki simboliai
  • tiksliai trys simboliai
    • pirmasis nėra A , arba
    • pirmasis yra A o antrasis - ne B , arba
    • pirmasis yra A , antrasis yra B , bet trečiasis nėra C
  • daugiau nei trys savavališki simboliai
2
09 сент. atsakymą pateikė Gumbo 09 rugsėjis 2009-09-09 00:07 '09 - 0:07 2009-09-09 00:07

.NET sistemoje galite naudoti grupavimą pagal savo pranašumą taip:

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

Jūs pastebėsite, kad:

 (ABC)|(.) 

Užfiksuos viską, išskyrus antrąją grupę ABC. Parentheses supa kiekvieną grupę. Taigi (ABC) yra 1 ir (.) Grupė.

Taigi, ką tik paimkite antrąją grupę, tokiu būdu:

 $2 

Arba, „.NET“, pažiūrėkite į „Regex“ klasės grupių rinkinį, kad būtų lengviau valdyti.

Taip pat galite atlikti kažką panašaus daugelyje kitų reguliarių išraiškų diegimų.

UPDATE: aš rasiu daug greičiau tai padaryti čia: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

Jis vis dar naudoja grupavimą (negaliu rasti būdo, kuris nenaudoja grupavimo). Tačiau šis metodas yra daugiau nei 10 kartų greitesnis nei pirmasis.

2
08 сент. Atsakymas, kurį pateikė Steve Wortham Rgs 08 2009-09-08 21:33 '09 21:33 2009-09-08 21:33

Peržiūrėkite kitus klausimus apie žymes arba užduoti klausimą