Toon posts:

[ASP.NET] Probleem met RegEx

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb een klein probleem met een regular expression die ik gebruik om iets te valideren, de hele regular expression is vrij groot dus ik post ff alleen het deel waarom het gaat.

code:
1
Name: (.*)


Op de plaats van (.*) mag alles komen te staan, en dat werkt ook maar er mag niet niks staan en er mogen ook niet alleen spaties staan.

Weet iemand hoe ik dit kan oplossen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

[^ ]+ in plaats van .*

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Dat had ik al geprobeerd, op die manier mogen er helemaal geen spaties in zitten, namen als "Sjaak Trekhaak" moet gewoon kunnen bijvoorbeeld.

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-12-2025

WormLord

Devver

Dan word het iets als:
code:
1
Name:  +([^ ]+.*)

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Volgens formele talen en automaten zoek je dan zoiets als:
(a*b+a*)+
Waarbij a een spatie betreft, en b alle karakters op een spatie na. Er staat dan in feite dat a nul of meer keer voor mag komen (kleene star) en b moet minstens 1 keer voorkomen; hetgeen wat je wil. Op deze wijze kunnen er namelijk nooit alleen spaties staan, dat volgt uit b die 1 of meer keer moet voorkomen. In Java zou je regex zoiets worden als: ([ ]*[^ ]+[ ]*)+ Let wel op. Deze regex vangt namen als:
code:
1
2
3
4
"    Sjaak     "
"    Sjaak         Trekhaak    "
"Sjaak       "
"       Sjaak"

etc...
De eerste / laatsta a* is dan in zekere zin dubbelop. Verwijder je b.v. de laatste a*, dan krijg je:
(a*b+)+ die dan matches heeft als:
code:
1
2
"      Sjaak"
"      Sjaak      Trekhaak"

Maar niet langer meer
code:
1
"      Sjaak      Trekhaak    "

In java zou je dan zoiets hebben als ([ ]*[^ ]+)+.
Je kan dan namen ook als volgt opvangen:
b+(a*b+)*
Dit dwingt dan af dat je begint met een karakter die niet een spatie is, vervolgens heb je een group die 0 of meer spaties mag bevatten, om vervolgens weer een karakter moet hebben die niet een spatie betreft. Deze group moet dan 0 of meer keer voorkomen. Je kan natuurlijk hierbij a ook veranderen naar a{1} of a?, indien je echt maar 1 (of in het laatste geval 1 of geen) spatie wil hebben.
Je regexp wordt iig dan zoiets als:
[^ ]+([ ]*[^ ]+)*
En zal matches hebben als:
code:
1
2
3
"Sjaak"
"Sjaak Trekhaak"
"Sjaak     Trekhaak"

Maar niet langer
code:
1
"   Sjaak  Trekhaak " etc...



De regexp van WormLord zal w.s. ook uitkomst bieden, alhoewel ik de + nog nooit voor een group heb gezien :) Misschien doet het exact hetzelfde ;)

[ Voor 85% gewijzigd door prototype op 18-07-2006 14:26 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

prototype schreef op dinsdag 18 juli 2006 @ 13:51:
De regexp van WormLord zal w.s. ook uitkomst bieden, alhoewel ik de + nog nooit voor een group heb gezien :) Misschien doet het exact hetzelfde ;)
Hij staat dan ook niet voor een groep, maar achter een spatie. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-12-2025

WormLord

Devver

-NMe- schreef op dinsdag 18 juli 2006 @ 14:38:
[...]

Hij staat dan ook niet voor een groep, maar achter een spatie. ;)
Inderdaad. :)
Maar ik zie nu dat ik wel een spatie teveel heb gebruikt. 8)7

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

-NMe- schreef op dinsdag 18 juli 2006 @ 14:38:
[...]

Hij staat dan ook niet voor een groep, maar achter een spatie. ;)
Pfff, zie ik nu pas :D, zet het dan ook in een character class i.e. square braces WormLord ;) :*
(of ik moet iets minder in de zon zitten ;))
WormLord schreef op dinsdag 18 juli 2006 @ 14:55:
[...]

Inderdaad. :)
Maar ik zie nu dat ik wel een spatie teveel heb gebruikt. 8)7
Mjah ik zie dat mijn laatste regexp ook loos is bij een operator.
code:
1
[^ ]+([ ]*[^ ]+)*

De kleene star bij de spatie is natuurlijk niet echt zinvol, aangezien als er dus geen spatie zou staan, deze altijd zou matchen met [^ ], i.e. greedy. De kleene star zou je dan moeten veranderen naar + of {1} afhankelijk van hoe streng je wil controleren, dus:
code:
1
[^ ]+([ ]+[^ ]+)*

of als je 1 spatie maar wil matchen:
code:
1
[^ ]+([ ]{1}[^ ]+)*

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

prototype schreef op dinsdag 18 juli 2006 @ 15:04:
Pfff, zie ik nu pas :D, zet het dan ook in een character class i.e. square braces WormLord ;) :*
Een character class voor één karakter is ook zo loos. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

-NMe- schreef op dinsdag 18 juli 2006 @ 15:14:
[...]

Een character class voor één karakter is ook zo loos. :)
Verschilt per persoon, ik zelf vind het er duidelijker op worden. Qua performance(penalty) zal het niet zo uitmaken denk ik aangezien dergelijke regexps worden gecompileerd naar DFA's.

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-12-2025

WormLord

Devver

prototype schreef op dinsdag 18 juli 2006 @ 15:04:
Pfff, zie ik nu pas :D, zet het dan ook in een character class i.e. square braces WormLord ;) :*
(of ik moet iets minder in de zon zitten ;))
Had ik ook bijna gedaan om de regex duidelijker te maken :)

Verwijderd

Topicstarter
Bedankt voor de reacties, kom er wel uit nu denk ik :)
Pagina: 1