[regex] "ongelijk aan" werkt niet

Pagina: 1
Acties:
  • 465 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • shades
  • Registratie: September 2001
  • Laatst online: 14-07 13:45
In onze organistatie hebben we een aantal speciale type accounts. Deze accounts beginnen met test_, gat_ of beheer_. De overige normale (gebruikers) accounts beginnen hier dus niet mee.

Omdat er gekozen is om deze info in een xml te plaatsen en met een regex te bepalen wat voor soort account het is.

Heb inmiddels twee vormen
code:
1
2
^test_|^gat_ // account begint met test_ of met gat_
^beheer_     // account begint met beheer_


Dat werkt maar ik krijg het niet voor elkaar om deze 3 uit te sluiten om zo te kunnen zien dat het een normaal account is. Het volgende werkt namelijk niet:
code:
1
!(^test_|^gat_|^beheer_)


Ik heb eigenlijk geen kennis van regex en gebruikt http://4umi.com/web/javascript/regex.htm voor de info en http://www.regxlib.com/RETester.aspx om te testen (regex engine is .NET want er schijnen wat verschillen te zijn kennelijk). Ik kan me niet voorstellen dat bovenstaand heel lastig is maar ik kom er niet uit.

https://k1600gt.nl


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je die 3 woorden niet wil matchen, betekent dat nog niet dat je automatisch de rest wel matcht.

Je denkt sowieso wat moeilijk, houd gewoon je regex hetzelfde en concludeer als er geen match is dat het een normaal account is. :)

{signature}


Acties:
  • 0 Henk 'm!

  • shades
  • Registratie: September 2001
  • Laatst online: 14-07 13:45
Voutloos schreef op maandag 07 januari 2008 @ 08:33:
Als je die 3 woorden niet wil matchen, betekent dat nog niet dat je automatisch de rest wel matcht.
euh waarom niet ?
Je denkt sowieso wat moeilijk, houd gewoon je regex hetzelfde en concludeer als er geen match is dat het een normaal account is. :)
Dan zou ik dus in eerste instantie de "default" gegevens in moeten laden en latern overschrijven in geval van een match van de eerste twee... Minder elegant

https://k1600gt.nl


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 19:27

crisp

Devver

Pixelated

Tsja, tenzij je dit soort constructies wil gaan gebruiken, wat de performance ook niet veel goed zal doen:
code:
1
^([^tgb]|t(?!=est_)|g(?!=at_)|b(?!=eheer_))

;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • shades
  • Registratie: September 2001
  • Laatst online: 14-07 13:45
crisp schreef op maandag 07 januari 2008 @ 09:35:
Tsja, tenzij je dit soort constructies wil gaan gebruiken, wat de performance ook niet veel goed zal doen:
code:
1
^([^tgb]|t(?!=est_)|g(?!=at_)|b(?!=eheer_))

;)
euh..

Ik heb net het volgende getest en dat lijkt goed te gaan (getest met http://www.regxlib.com/RETester.aspx). Misschien dat je kan uitleggen wat er in je expressie gebeurt want ik kan er geen chocola van maken :? Nu zal het met de performance wel meevallen aangezien de naam van een account doorgaans niet veel langer is dan 15 karakters en alleen het begin gecheckt wordt toch ?
code:
1
^(?!gat_)(?!test_)(?!beheer_)

[ Voor 14% gewijzigd door shades op 07-01-2008 13:37 ]

https://k1600gt.nl


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
shades schreef op maandag 07 januari 2008 @ 11:01:
Misschien dat je kan uitleggen wat er in je expressie gebeurt want ik kan er geen chocola van maken :?
* ValHallASW wijst subtiel naar zijn signature.
Gewoon geen regexp gebruiken maar gewoon
code:
1
if !(name.StartsWith('test') || name.StartsWith('beheer') || name.StartsWith('gat'))

(ik ben er vanuit gegaan dat als je de .NET regexp library gebruikt dat je dan ook wel gewoon .NET strings zult gebruiken... anders moet je het even ombouwen voor je eigen programmeertaal.)
veel leesbaarder (en ja, het doet hetzelfde als die inverse match)

[ Voor 44% gewijzigd door ValHallASW op 07-01-2008 12:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik denk dat jij maar eens moet na gaan waarom jij in vredes naam scheiding maakt in type accounts dmv usernames. Dit is natuurlijk de meest baggere manier van werken. Gewoon per account type een apart tabel. test gebruikers in Test en Beheerder in Admin tabel. Als jij een bestaande applicatie heb overgenomen dan zou ik dit als eerste aanpassen. Ik krijg rilling over mijn rug bij zulke verschrikkelijk slecht opgezette applicaties. Dit is wellicht iets om op www.thedailywtf.com te plaatsen

Acties:
  • 0 Henk 'm!

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 08-07 14:27
shades schreef op maandag 07 januari 2008 @ 11:01:
[...]


euh..

Ik heb net het volgende getest en dat lijkt goed te gaan (getest met http://www.regxlib.com/RETester.aspx). Misschien dat je kan uitleggen wat er in je expressie gebeurt want ik kan er geen chocola van maken :? Nu zal het met de performance wel meevallen aangezien de naam van een account doorgaans niet veel langer is dan 15 karakters en alleen het begin gecheckt wordt toch ?
code:
1
^(?!gat_)(?!srna_ta_)(?!srna_lb_)
Hij checkt of de strin niet begint met t,g of b, en anders als hij met een t begint dat niet gevolgt wordt door est, g gevolgd door at en b door eheer.

Reguliere expressie zijn niet echt bedoelt om dingen niet te matchen..

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
shades schreef op maandag 07 januari 2008 @ 08:18:
Omdat er gekozen is om deze info in een xml te plaatsen en met een regex te bepalen wat voor soort account het is.
Argh! Dan heb je hier meteen het probleem te pakken dat je aan het oplossen zou moeten zijn.
Waarom niet gewoon een <accounttype/> node/attribuut toevoegen?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • shades
  • Registratie: September 2001
  • Laatst online: 14-07 13:45
ValHallASW schreef op maandag 07 januari 2008 @ 12:04:
[...]

* ValHallASW wijst subtiel naar zijn signature.
Gewoon geen regexp gebruiken maar gewoon
code:
1
if !(name.StartsWith('test') || name.StartsWith('beheer') || name.StartsWith('gat'))

(ik ben er vanuit gegaan dat als je de .NET regexp library gebruikt dat je dan ook wel gewoon .NET strings zult gebruiken... anders moet je het even ombouwen voor je eigen programmeertaal.)
veel leesbaarder (en ja, het doet hetzelfde als die inverse match)
Oplossen in (hard)code is niet wenselijk. Daarom wil ik het oplossen met een reguliere expressie. Ik zou wel iets kunnen verzinnen met string, deze splitten en doorlopen maar vind ik minder elegant
Verwijderd schreef op maandag 07 januari 2008 @ 12:16:
Ik denk dat jij maar eens moet na gaan waarom jij in vredes naam scheiding maakt in type accounts dmv usernames. Dit is natuurlijk de meest baggere manier van werken. Gewoon per account type een apart tabel. test gebruikers in Test en Beheerder in Admin tabel. Als jij een bestaande applicatie heb overgenomen dan zou ik dit als eerste aanpassen. Ik krijg rilling over mijn rug bij zulke verschrikkelijk slecht opgezette applicaties. Dit is wellicht iets om op www.thedailywtf.com te plaatsen
De accounts zijn niet door mij bepaalt. Ik moet het ermee doen - en ik heb ook duidelijk gemaakt hier geen vragen over te stellen (dacht ik). Dit heeft ook niets met mysql, sql of wat dan ook te maken.
Juup schreef op maandag 07 januari 2008 @ 12:21:
[...]

Argh! Dan heb je hier meteen het probleem te pakken dat je aan het oplossen zou moeten zijn.
Waarom niet gewoon een <accounttype/> node/attribuut toevoegen?
Hallo;
XML:
1
2
3
4
5
<productie>
   <accountlocatie pattern="^gat_|^test">instellingen 1</accountlocatie>
   <accountlocatie pattern="^beheer_">instellingen 2</accountlocatie>
   <!-- etc -->
</productie>

https://k1600gt.nl


Acties:
  • 0 Henk 'm!

  • DPLuS
  • Registratie: April 2000
  • Niet online

DPLuS

 

Die 'ongelijk aan' -constructie in een regex gaat zo niet werken.

Zie ook: [PERL] probleem met regex

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
shades schreef op maandag 07 januari 2008 @ 13:40:
XML:
1
2
3
4
5
<productie>
   <accountlocatie pattern="^gat_|^test">instellingen 1</accountlocatie>
   <accountlocatie pattern="^beheer_">instellingen 2</accountlocatie>
   <!-- etc -->
</productie>
dat doe je dus zo:
XML:
1
2
3
4
5
6
7
<productie>
   <accountlocatie prefix="gat_">instellingen 1</accountlocatie>
   <accountlocatie prefix="test_">instellingen 1</accountlocatie>
   <accountlocatie prefix="beheer_">instellingen 2</accountlocatie>
   <accountlocatie>instellingen 3</accountlocatie> <!-- default als geen prefix matcht -->
   <!-- etc -->
</productie>

Alhoewel diegenen die zeggen dat account prefixen een DailyWTF zijn natuurlijk wel gelijk hebben.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 17:23

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

shades schreef op maandag 07 januari 2008 @ 13:40:
[...]


Oplossen in (hard)code is niet wenselijk. Daarom wil ik het oplossen met een reguliere expressie. Ik zou wel iets kunnen verzinnen met string, deze splitten en doorlopen maar vind ik minder elegant
En die regexp. staat niet in je code wil je zeggen? Die strings waarop gematcht wordt in dat voorbeeld kan je natuurlijk ook gewoon netjes in constanten zetten die bovenaan je code gedefinieerd zijn, of zelfs ergens in die xml file.

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • shades
  • Registratie: September 2001
  • Laatst online: 14-07 13:45
MSalters schreef op maandag 07 januari 2008 @ 20:13:
[...]

dat doe je dus zo:
XML:
1
2
3
4
5
6
7
<productie>
   <accountlocatie prefix="gat_">instellingen 1</accountlocatie>
   <accountlocatie prefix="test_">instellingen 1</accountlocatie>
   <accountlocatie prefix="beheer_">instellingen 2</accountlocatie>
   <accountlocatie>instellingen 3</accountlocatie> <!-- default als geen prefix matcht -->
   <!-- etc -->
</productie>

Alhoewel diegenen die zeggen dat account prefixen een DailyWTF zijn natuurlijk wel gelijk hebben.
mm ja, daar had ik nog niet aan gedacht.

Ik vind dat hele dailywtf geneuzel nogal overdreven |:( Jullie kennen de situatie niet en ga me daar ook niet over uitlaten :|
Orion84 schreef op maandag 07 januari 2008 @ 20:18:
[...]

En die regexp. staat niet in je code wil je zeggen? Die strings waarop gematcht wordt in dat voorbeeld kan je natuurlijk ook gewoon netjes in constanten zetten die bovenaan je code gedefinieerd zijn, of zelfs ergens in die xml file.
Euh die constanten zijn niet echt constant vandaar de keuze om deze niet hardcoded te gaan gebruiken en zet staan al in een xml (pattern) :?

Naja ik ga de oplossing van MSalters toepassen. Dan blijft het eenvoudiger en flexibel. Dat wil ik naar toe.

https://k1600gt.nl


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Misschien lichtelijk offtopic maar waarom wil je eigenlijk regexes gebruiken? Is splitten op _ en het eerste resultaat controleren niet handiger? Het zal in ieder geval sneller zijn dan een negative lookahead regex lijkt me.

Blog [Stackoverflow] [LinkedIn]

Pagina: 1