Avatar billede enggaard Nybegynder
17. september 2005 - 12:49 Der er 5 kommentarer og
2 løsninger

pattern matching med reg exp

Hej, jeg sidder og er ved at lave en log parser til et online rolle spil.

logfilen består af linier i still med:

Aldebaren hits Flamewaker Elite for 62.
(-source- hits -target- for -dmg-)

eller f. eks.
Aldebaren's Flash of Light heals Archon for 386.
(-source-'s -spell- heals -target- for -hitpoints-)

Her skal jeg selffølgelig bruge noget som kan genkende de mønstre der er i disse linier. Min første tanke var at lave en parser med tilstands og aktions tabeller, men kom til at tænke på om ikke regulære udtryk ville være smartere til dette.

Problemet er bare at jeg ikke har specielt meget kendskap til regexp.

Findes der en måde at pattern matche på linier som disse, hvor man samtidig kan lægge de variable text strenge ned i variabler i selve koden?

noget med:


patternmatch("Aldebaren hits Flamewaker Elite for 62.", "%1 hits %2 for %3", source, target, damage);

hvorefter så
source = "Aldebaren"
target = "Flamewalker Elite"
damage = "62";
Avatar billede arne_v Ekspert
17. september 2005 - 12:51 #1
eksempel til inspiration:

using System;
using System.Text.RegularExpressions;

public class Test {
    public static void Parse(string s)
    {
        MatchCollection res = Regex.Matches(s,"(?:stat\\(\")([^\"]*)(?:\",\")([^\"]*)(?:\"\\);)");
        for(int i = 0; i < res.Count; i++) {
            Console.WriteLine("stat " + res[i].Groups[1] + " " + res[i].Groups[2]);
        }
    }
    public static void Main(string[] args) {
        string s = "// yyy xxx\r\n" +
                  "stat(\"yyy\",\"xxx\");\r\n" +
                  "// aaa bbb\r\n" +
                  "stat(\"aaa\",\"bbb\");\r\n";
        Console.WriteLine(s);
        Parse(s);
    }
}
Avatar billede nielle Nybegynder
17. september 2005 - 13:05 #2
Mit bud:

using System;
using System.Text.RegularExpressions;

namespace e648779
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            string Source, Target;
            int Damage;

            PatternMatch("Aldebaren hits Flamewaker Elite for 62.", "%1 hits %2 for %3", out Source, out Target, out Damage);

            Console.WriteLine("Source: " + Source);
            Console.WriteLine("Target: " + Target);
            Console.WriteLine("Damage: " + Damage);
        }

        static void PatternMatch(string Input, string Pattern, out string Source, out string Target, out int Damage)
        {
            Pattern = Pattern.Replace("%1", "(?<source>.+)");
            Pattern = Pattern.Replace("%2", "(?<target>.+)");
            Pattern = Pattern.Replace("%3", @"(?<damage>\d+)");

            Regex RE = new Regex(Pattern);
            Match REM = RE.Match(Input);

            if (REM.Success)
            {
                Source = REM.Groups["source"].Value;
                Target = REM.Groups["target"].Value;
                Damage = int.Parse(REM.Groups["damage"].Value);
            }
            else
            {
                Source = "";
                Target = "";
                Damage = -1;
            }
        }
    }
}
Avatar billede nielle Nybegynder
26. september 2005 - 22:43 #3
Har du fået kigget på det?
Avatar billede nielle Nybegynder
18. oktober 2005 - 22:39 #4
?
Avatar billede enggaard Nybegynder
10. juli 2007 - 10:16 #5
Crap det er længe siden det her mand.

Well projektet er droppet, men i kan smide et svar begge to så får i points :)
Avatar billede arne_v Ekspert
10. juli 2007 - 15:42 #6
ok
Avatar billede nielle Nybegynder
10. juli 2007 - 18:06 #7
:^)
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