Avatar billede trenskow Nybegynder
12. maj 2005 - 00:43 Der er 11 kommentarer og
1 løsning

RegEx opfører sig underligt

Hejsa allesammen

Jeg er ny i denne regex verden, og har en del problemer med at få det til at virke.

Jeg har i Expresso lavet denne expression
<tr.*?<div\salign="center">([0-9][0-9]?:[0-9][0-9]\s(?:AM|PM))\s</div>.*?<div\salign="center">(.*?)</div>.*?<div\salign="center">(.*?)\s</div>.*?</tr>

i expresso fungerer den helt normalt, og finder det der skal findes.
Men når jeg vil køre den over i C# sker der underlige ting.

Jeg har en teksbox hvor jeg smider præsic den samme tekst ind i, og kører denne kode

String temp2 = @"<tr.*?<div\salign=""center"">([0-9][0-9]?:[0-9][0-9]\s(?:AM|PM))\s</div>.*?<div\salign=""center"">(.*?)</div>.*?<div\salign=""center"">(.*?)\s</div>.*?</tr>";
Regex re = new Regex(temp2,RegexOptions.Singleline);
MatchCollection res = re.Matches(temp);  // temp er strengen fra tekstbox

foreach (Match m in res)
{
    Console.WriteLine(m.Groups[x].Value);
}

Her får jeg et komplet anderledes resultat....
Hvad er det jeg gør galt her?
Avatar billede trenskow Nybegynder
12. maj 2005 - 00:45 #1
ok, ved ikke lige hvad der skete på 2 af linierne, men teksten forsvandt da langt ud til højre hos mig...
her kommer de 2 linier igen
Expression i expresso
<tr.*?<div\salign="center">([0-9][0-9]?:[0-9][0-9]\s(?:AM|PM))\s</div>.*?
<div\salign="center">(.*?)</div>.*?<div\salign="center">(.*?)\s</div>.*?</tr>

Expression i C#
String temp2 = @"<tr.*?<div\salign=""center"">([0-9][0-9]?:[0-9][0-9]\s(?:AM|PM))\s
</div>.*?<div\salign=""center"">(.*?)</div>.*?<div\salign=""center"">(.*?)\s
</div>.*?</tr>";
Avatar billede nielle Nybegynder
12. maj 2005 - 08:24 #2
Godt nok er regular expressions et værktøj man efterhånden finder mange steder, men det betyder desværre ikke at syntaksen er helt ens ret mange af disse steder. Selvom tingene ligner hinanden på overfladen er der små foreskelle på både syntaks og muligheder i alt fra perl, sed, awk, php, asp (vbscipt) og .net. Det kommer derfor ikke som nogen overraskelse at noget, som virker i expresso, ikke automatisk virker i C# (altså .net).
Avatar billede nielle Nybegynder
12. maj 2005 - 08:58 #3
Imidlertid er der ikke noget i vejen med dit C# udtryk - det virker. Spørgsmålet er så om det er korrekt i forhold til det du ønsker at matche, og det kan man jo ikke rigtigt sige noget om uden at se noget typisk input.

Jeg undre mig dog over at du bruger \s sammen med RegexOptions.Singleline - medmindre at nogen indsætter tabs i stedet for mellemrum i koden matcher \s nemlig netop kun linjeskift foruden mellemrum. Du kunne altså lige så godt have nøjes med et mellemrum.

Men, vis noget typisk input og så skal jeg nok få det til at fungere.
Avatar billede nielle Nybegynder
17. maj 2005 - 17:31 #4
Hvad med lidt respons her?
Avatar billede trenskow Nybegynder
17. maj 2005 - 17:47 #5
åh... undskyld.. jeg har været væk på en lille ferie, og har glemt alt om det..
Skal lige kigge på det, og svarer igen her idag eller imorgen
Avatar billede trenskow Nybegynder
18. maj 2005 - 23:50 #6
Så har jeg leget lidt med det igen.
Jeg skal fange en af de 2 her
<item><title>May 18, 2005 | 7:00 am | no limit Hold&#39;em | $5.00+$0.50 </title><link>http://www.ultimatebet.com/promotions/tournament-schedule.html</link><description><![CDATA[The more people who play, the bigger the prize pool!]]></description></item>
eller denne her
<item><title>May 18, 2005 | 8:00 am | no limit Hold&#39;em | $30.00+$3.00 | $1800 Guaranteed</title><link>http://www.ultimatebet.com/promotions/tournament-schedule.html</link><description><![CDATA[The prize pool is guaranteed to be at least $1,800!  The more people who play, the bigger the prize pool!]]></description></item>

Jeg har lavet en regex der ser sådan her ud
<item><title>(.*?)\s(\d+).*?(\d+)\s\x7C\s(\d+):(\d+)\s(am|pm)\s\x7C\s(.*?)\s\x7C\s(.*?)</title><link>.*?</link>.*?CDATA\x5B(.*?)\x5D\x5D></description></item>

Mit problem er, at den regex jeg har lavet, fanger fint dem begge.
i den 8. den skal fange får jeg i den 1.
$5.00+$0.50
og i den 2.
$30.00+$3.00 | $1800 Guaranteed
I den her, vil jeg også gerne have adskilt dem med | så jeg får 9 i den første, og 10 i den anden.
Avatar billede trenskow Nybegynder
18. maj 2005 - 23:51 #7
Min regex skal vist lige deles op så den vises ordentligt..
<item><title>(.*?)\s(\d+).*?(\d+)\s\x7C\s(\d+):(\d+)\s(am|pm)\s\x7C\s(.*?)\s\x7C\s(.*?)</title>
<link>.*?</link>.*?CDATA\x5B(.*?)\x5D\x5D></description></item>
Avatar billede nielle Nybegynder
19. maj 2005 - 09:00 #8
1) Øhm? Jeg synes at dette er et helt nyt spørgsmål. Hvad skete der med den oprindelige problemstilling - fik du løst den?

2) Jeg kan se at du har gang i noget XML. I den sammenhæng mener jeg at det ville være en rigtig god ide at først lave noget basal XML-parsing med klasserne fra System.Xml.

3) Jeg har vendt og drejet det på utallige måder, men jeg han simpelthen ikke finde ud af hvad det er du mener med den sidste linje i "18/05-2005 23:50:01" hvor du skriver: "I den her, vil jeg også gerne have adskilt dem med | så jeg får 9 i den første, og 10 i den anden.". Kunne du ikke lige uddybe?

Nå, men ellers har jeg bikset noget kode sammen som du måske kan bruge:

using System;
using System.Text.RegularExpressions;

namespace Eksperten
{
    class App
    {
        [STAThread]
        static void Main(string[] args)
        {
            string Text1 = "<item><title>May 18, 2005 | 7:00 am | no limit Hold&#39;em | $5.00+$0.50 </title><link>http://www.ultimatebet.com/promotions/tournament-schedule.html</link><description><![CDATA[The more people who play, the bigger the prize pool!]]></description></item>";
            string Text2 = "<item><title>May 18, 2005 | 8:00 am | no limit Hold&#39;em | $30.00+$3.00 | $1800 Guaranteed</title><link>http://www.ultimatebet.com/promotions/tournament-schedule.html</link><description><![CDATA[The prize pool is guaranteed to be at least $1,800!  The more people who play, the bigger the prize pool!]]></description></item>";

            DoRegex(Text1);
            DoRegex(Text2);
        }

        static void DoRegex(string Text)
        {
            string Pattern = @"<item><title>(?<Måned>.+?) (?<Dato>\d+), (?<År>\d{4}) \| (?<Timer>\d{1,2}):(?<Minutter>\d{2}) (?<AmPm>am|pm) \| .+? \| (?<Priser>.+) (\| (?<Garanti>.+))?</title><link>.*\[CDATA\[(?<Tekst>.*)\]\]";

            Regex RE = new Regex(Pattern);
            Match M = RE.Match(Text);

            if (M.Success)
            {
                Console.WriteLine("Måned  : " + M.Groups["Måned"].Value);
                Console.WriteLine("Dato    : " + M.Groups["Dato"].Value);
                Console.WriteLine("År      : " + M.Groups["År"].Value);
                Console.WriteLine("Timer  : " + M.Groups["Timer"].Value);
                Console.WriteLine("Minutter: " + M.Groups["Minutter"].Value);
                Console.WriteLine("Am/pm  : " + M.Groups["AmPm"].Value);
                Console.WriteLine("Priser  : " + M.Groups["Priser"].Value);

                if (M.Groups["Garanti"].Value != "")
                    Console.WriteLine("Garanti : " + M.Groups["Garanti"].Value);

                Console.WriteLine("Tekst  : " + M.Groups["Tekst"].Value);

                Console.WriteLine();
            }
        }
    }
}
Avatar billede trenskow Nybegynder
19. maj 2005 - 23:19 #9
Nielle.. takker.
Der er point til dig, hvis du vil smide et svar
Avatar billede nielle Nybegynder
20. maj 2005 - 06:25 #10
Oki :^)
Avatar billede nielle Nybegynder
27. maj 2005 - 18:39 #11
?
Avatar billede nielle Nybegynder
24. juni 2005 - 17:54 #12
Lukketid?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester