[C# / .NET] Regex doet niet wat verwacht wordt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
Ik ben net begonnen met System.Text.RegularExpressions in C# en volgens een voorbeeld
zou ^\d{5}$ moeten matchen met 12345 maar niet met 1234 of asadf12345

ik gebruik deze code:
C#:
1
2
3
4
5
6
7
8
        static void Main(string[] args)
        {
            if(Regex.IsMatch(args[1], args[0] ))
                Console.WriteLine("Match");
            else
                Console.WriteLine("No match");
            Console.ReadLine();
        }


Aanroep: c:\>app.exe ^\d{5}$, 12345
Output No match

tevens geeft

C#:
1
2
3
4
5
6
7
8
        static void Main(string[] args)
        {
            if(Regex.IsMatch(@"^\d{5}$","12345" ))
                Console.WriteLine("Match");
            else
                Console.WriteLine("No match");
            Console.ReadLine();
        }


ook het verkeerde resultaat. Volgens MCTS Application Development zou dit echter moeten werken.
Ik denk zelf dat ik ergens in VS2005 iets verkeerds heb staan

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Dit hoort niet thuis in DTE, maar in Programming. Het is nl. een programmeer-probleem, en geen probleem dat gerelateerd is aan je IDE .

-> PRG

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Even over je probleem:
Je hebt 2 soorten regular expressions : multi-line & niet multi-line.

Mijn ervaring is dat, als je geen multi-line regexen gebruikt, die ^(begin v/d regel) en $ (einde regel) instructies niet werken. (Geen idee of dit standaard is, of als dit enkel in .NET zo is, ik ben geen Regex guru oid en heb er mij verder ook niet in verdiept of dit normaal is of niet. ).

Als je dus die $ en ^ weglaat, dan zal je Regex wel een match geven.
Ook als je in de constructor van je Regex de optie aangeeft dat dit een Multiline regex is, zal je expressie wel werken met de $ en ^ karakters.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Spiral schreef op maandag 28 juli 2008 @ 21:40:
tevens geeft

C#:
1
2
3
4
5
6
7
8
        static void Main(string[] args)
        {
            if(Regex.IsMatch(@"^\d{5}$","12345" ))
                Console.WriteLine("Match");
            else
                Console.WriteLine("No match");
            Console.ReadLine();
        }


ook het verkeerde resultaat.
Dan kan kloppen, de omschrijving van IsMatch is:
C#:
1
2
3
4
public static bool IsMatch (
    string input,
    string pattern
)

M.a.w.: je hebt je input en je pattern omgewisseld (wat je in je eerste codevoorbeeld trouwens niet deed). Probeer eens Regex.IsMatch("12345", @"^\d{5}$")

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Ik weet niet of de .NET regexen een PCRE compatible syntax hebben, maar daarin hoor je de ^ en $ voor begin en einde van de regel ook in single line regexen te kunnen gebruiken. Dat is nodig, als je bijvoorbeeld wilt dat de gehele zin je patroon matched en niet slechts een deel van een zin. Met een syntax die geen begin-/einde-zin markeringen omvat, ben je beperkt in je mogelijkheden, ook als je alleen maar single-line matching aan het doen bent.

Voorbeeld: je wilt wel dat "AAABB" matched, maar niet dat "AAABBAAA" matched. De regex "^AAABB$" matched alleen de eerste, terwijl de regex "AAABB" de eerste en de tweede matched. Als het eerste niet kan, heb je een probleem.

[ Voor 8% gewijzigd door Confusion op 28-07-2008 22:15 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Hmm, dit lukt bij mij wel:
code:
1
Regex.IsMatch("12345", @"^\d{5}$");

Echter, op onderstaande manier moet ik wel de optie 'multiline' specifieren:
C#:
1
2
Regex r = new Regex (@"^\d{5}$");
r.IsMatch("12345");
Geeft dus false als output;
dit:
C#:
1
2
Regex r = new Regex (@"^\d{5}$", RegexOptions.Multiline);
r.IsMatch("12345");



returned dan weer true.

[ Voor 3% gewijzigd door whoami op 28-07-2008 22:21 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
MrBucket schreef op maandag 28 juli 2008 @ 22:09:
[...]

Dan kan kloppen, de omschrijving van IsMatch is:
C#:
1
2
3
4
public static bool IsMatch (
    string input,
    string pattern
)

M.a.w.: je hebt je input en je pattern omgewisseld (wat je in je eerste codevoorbeeld trouwens niet deed). Probeer eens Regex.IsMatch("12345", @"^\d{5}$")
Ai! dat krijg je als je iets overneemt vanuit het boek ... 8)7 Het werkt idd dan wel in het tweede voorbeeld wat ik gaf. Parameters omgedraait ...

Maar het eerste voorbeeld vanaf de console werkt niet. volgens het boek van MCTS 70-536 Application Development Foundation zou het eerste voorbeeld echt moeten matchen dmv het aanroepen vanaf de commandline c:\>app.exe ^\d{5}$, 12345. Alleen hij geeft No match aan. En als ik het zonder de caret en dollar doe dan accepteert hij ook bv. aasb12345. En die wil

Het functioneert, ik heb het verkeerd geïnterperteerd. De regex doet wat het moet doen en accepteerd ook aasb12345. Ik zat te rommelen met de commandpromt runtime rebuilden ...

offtopic:
Morgen weer een nieuwe dag

[ Voor 12% gewijzigd door Spiral op 28-07-2008 22:52 ]

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Use the force debugger, young Skywalker 8)

Zet eens een breakpoint op de aanroep van IsMatch, en debug je programma eens (let wel: de commandline parameters moet je dan specificeren bij de opties van je Project - rechtermuisknop op je Project, "Properties", en dan denk ik de Debug tabpagina, zo uit m'n hoofd). Kijk eens of hetgeen wat je via de commandline parameters specificeert ook op de juiste plek uitkomt in je call naar IsMatch.

--edit:
Ah, ok. Evengoed blijft mijn advies staan: leer te werken met de debugger van VS. Deze is zeer krachtig, en het helpt je tig keer sneller fouten uit je programma te halen dan d.m.v. trial and error.

[ Voor 19% gewijzigd door MrBucket op 28-07-2008 22:55 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Hmm , ik heb nog eens getest, en mijn eerdere beweringen blijken alsnog niet te kloppen :?
vreemd; morgen met een frisse kop misschien nog eens kijken. :P

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
MrBucket schreef op maandag 28 juli 2008 @ 22:53:
Use the force debugger, young Skywalker 8)

de commandline parameters moet je dan specificeren bij de opties van je Project - rechtermuisknop op je Project, "Properties", en dan denk ik de Debug tabpagina, zo uit m'n hoofd
Daar zal ik 'ns naar kijken.

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 01-08 12:04

WormLord

Devver

Ik heb even je eerste code voorbeeld getest en die werkt gewoon zoals het hoort.
In je aanroep heb je echter een komma als laatste teken in je reguliere expressie staan. Dat gaat natuurlijk niet werken. Het moet zijn:
Aanroep: c:\>app.exe ^\d{5}$ 12345

Acties:
  • 0 Henk 'm!

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Voor .NET regexen raad ik expresso aan, een freeware regex editor

http://www.ultrapico.com/ExpressoDownload.htm

werkt echt erg fijn om te testen en te debuggen.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
WormLord schreef op dinsdag 29 juli 2008 @ 09:30:
Ik heb even je eerste code voorbeeld getest en die werkt gewoon zoals het hoort.
In je aanroep heb je echter een komma als laatste teken in je reguliere expressie staan. Dat gaat natuurlijk niet werken. Het moet zijn:
Aanroep: c:\>app.exe ^\d{5}$ 12345
Scherp van die komma! Die heb ik niet gebruikt op de console. De warmte speelde mij wellicht parten ;)

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles

Pagina: 1