Avatar billede Nervatos Seniormester
16. juli 2012 - 18:14 Der er 5 kommentarer og
1 løsning

CS status

Hej Eksperten.

Jeg er støt ind i et problem, som jeg håber vi i fællesskab kan løse.
Det drejer sig om et status script fra en CS server. Det output jeg får, vil jeg lave om via en REGEX, således jeg sender det data der er brug for videre.

Lige nu får jeg dette output:

1 "GoldenEye | Elisabeth ^CCL" 80 STEAM_0:0:34801024  1 26:42    6    0 80.63.20.96:27005 2    "nYx" 84 STEAM_0:1:28364009  3 24:14  38    0 83.89.20.6:27005
3 "SMART | Mr_S.W.A.G!!" 99 STEAM_0:1:15644967  0 02:23  23    0 93.90.4.15:27005
5 "Hebo^ Musthave?" 82 STEAM_0:0:13622139  12 24:15  29    0 62.198.61.169:54431
6 "[Old_Dogs] isa" 87 STEAM_0:1:2215342  8 17:06  21    0 188.178.63.58:27005
# 7 "TargeT On My Ass^" 93 STEAM_0:1:4279347  1 13:17  16    0 178.157.227.140:27005
# 8 "ShaDoW LoVe Goa^Gab" 74 STEAM_0:0:10712147  10  1:30:47  15    0 188.114.188.134:27005
# 9 "^=BioN=^ .Von Pzyko*RealDeal*" 97 STEAM_0:1:10815490  4 08:14  19    0 188.176.3.88:27005
#10 "ghostbuster" 98 STEAM_0:0:2089076  4 04:51  48    0 95.166.45.53:27005

Min REGEX ser sådan ud:

const string REGEX = @"(?<id>\d+)?\s+""(?<name>[^""]+)""\s+(?<userid>\d+)?\s+(?<steamid>STEAM_[0-5]:[01]:\d+)?\s+(?<kills>\d+)?\s+(?<time>(([0-9])|([0-1][0-9])|([2][0-3])):(([0-9])|([0-5][0-9])))?\s+(?<ping>\d+)?\s+(?<loss>\d+)?\s+(?<ip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5})";
                    Match m = Regex.Match(currLine, REGEX);

Jeg får dette udfra REGEX:

[#99] SMART | Mr_S.W.A.G!! (STEAM_0:1:15644967) - IP: 93.90.4.15:27005
[#87] [Old_Dogs] isa (STEAM_0:1:2215342) - IP: 188.178.63.58:27005
[#93] TargeT On My Ass^ (STEAM_0:1:4279347) - IP: 178.157.227.140:27005
[#97] ^=BioN=^ .Von Pzyko*RealDeal* (STEAM_0:1:10815490) - IP: 188.176.3.88:27005
[#98] ghostbuster (STEAM_0:0:2089076) - IP: 95.166.45.53:27005


Det vil sige, der er 9 online på serveren, som også er i output. Jeg får kun fat i 5 spillere, så jeg må gøre noget galt.

Tror min REGEX trænger til en kærlig hånd.

God aften.
Avatar billede janus_007 Nybegynder
16. juli 2012 - 18:50 #1
Jeg ville nu aldrig bruge en regex til den slags, dit data ligger jo fint formateret.
RegEx er noget man oftere bruger hvis man skal matche komplicerede sekvenser eks.vis find alt som starter med + indeholder + ender med osv.

Det data du har ligner noget der mere kan splittes på mellemrum osv.
Avatar billede Nervatos Seniormester
18. juli 2012 - 16:57 #2
Jamen, hvis jeg nu kun skal bruge userid, navn og IP.
Hvordan skal jeg så hive det ud, på anden måde end RegEx?

Kunne du komme med et eksempel?
Avatar billede mireigi Novice
25. juli 2012 - 09:38 #3
Hvis alle bruger Steam, kan du gøre dette:

string data[] = GetFromYourSource();

foreach (string entry in content)
{
  int steamIndex = entry.IndexOf("STEAM");
  int ipIndex = entry.LastIndexOf(" ");
 
  string name = entry.Substring(0, steamIndex);
  string userId = entry.Substring(steamIndex, ipIndex - steamIndex);
  string ip = entry.Substring(ipIndex);

  SaveRecord(name, userId, ip);
}


GetFromYourSource() skal returnere enten et string array eller en string list, med én linje fra kilden per item i arrayet/listen.
Avatar billede Nervatos Seniormester
15. august 2012 - 11:22 #4
Lægger du svar mireigi, det hjalp en del. :o)
Tak for hjælpen.
Avatar billede mireigi Novice
15. august 2012 - 11:28 #5
Velbekomme.

Du må gerne lægge den færdige løsning herind, så andre kan få gavn af den også :)
Avatar billede Nervatos Seniormester
15. august 2012 - 17:33 #6
Brugte faktisk bare din løsning, og ændrede den til den korrekte string.
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