Avatar billede hmortensen Nybegynder
23. juli 2007 - 18:42 Der er 18 kommentarer og
1 løsning

Regex parsing

Hej

Jeg har en streng som kan se sådan her ud:
["En streng", 123, -32, 321, "A"],
["En streng2", 456, 432, 4325, "B"],
["En streng3", 789, 0, 7635, "C"]

Hvordan parser jeg nemmest den?
Jeg har prøvet at lave nogle grupper under hvert samlede match, men det gik ikke helt godt.

Mvh
hmortensen
Avatar billede kalp Novice
23. juli 2007 - 18:45 #1
er hele eksemplet én streng som du gerne vil opdele i flere strenge? (som er dem pr. linje?)
Avatar billede hmortensen Nybegynder
23. juli 2007 - 18:46 #2
Ja det er en linie, hvori jeg gerne vil have hver enkelt værdi ud hver for sig, så jeg kan pakke alt mellem hver [] ind i objekt.
Avatar billede kalp Novice
23. juli 2007 - 18:49 #3
okay så det her er 3 eksempler

["En streng", 123, -32, 321, "A"],
["En streng2", 456, 432, 4325, "B"],
["En streng3", 789, 0, 7635, "C"]

så du skal have plukket alt ud mellem , i sådan en sætning
["En streng3", 789, 0, 7635, "C"]

?
Avatar billede hmortensen Nybegynder
23. juli 2007 - 18:51 #4
Ja præcis.
Avatar billede ranglen Nybegynder
23. juli 2007 - 19:06 #5
Kan komma og firkantede parenteser forekomme i "en streng"?
Avatar billede hmortensen Nybegynder
23. juli 2007 - 19:07 #6
Ja det kan de godt.
Avatar billede kalp Novice
23. juli 2007 - 19:09 #7
så den kan se ud som det her?

["En [streng], 3", 789, 0, 7635, "C"]
Avatar billede hmortensen Nybegynder
23. juli 2007 - 19:11 #8
Ja, og også indeholde .-_()
Avatar billede arne_v Ekspert
23. juli 2007 - 19:13 #9
Til inspiration:

using System;
using System.Text.RegularExpressions;

namespace E
{
    public class MainClass
    {
        public static void Main(string[] args)
        {
            string s = @"[""En streng"", 123, -32, 321, ""A""],
[""En streng2"", 456, 432, 4325, ""B""],
[""En streng3"", 789, 0, 7635, ""C""]";
            Console.WriteLine(s);
            Regex re = new Regex(@"(?:\["")([A-Za-z0-9 ]*)(?:"",[ ]*)(
  • *[0-9]+)(?:,[ ]*)([-]*[0-9]+)(?:,[ ]*)([-]*[0-9]+)(?:,[ ]*"")([A-Za-z0-9 ]*)(?:""\])", RegexOptions.Singleline);
            MatchCollection mc = re.Matches(s);
            foreach(Match m in mc)
            {
                Console.WriteLine(m.Groups[0].Value);
                Console.WriteLine(m.Groups[1].Value + " " +
                                  m.Groups[2].Value + " " +
                                  m.Groups[3].Value + " " +
                                  m.Groups[4].Value + " " +
                                  m.Groups[5].Value);
            }
        }
    }
}
Avatar billede arne_v Ekspert
23. juli 2007 - 19:14 #10
Med de sidste requirement er foelgende nok bedre:

using System;
using System.Text.RegularExpressions;

namespace E
{
    public class MainClass
    {
        public static void Main(string[] args)
        {
            string s = @"[""En streng"", 123, -32, 321, ""A""],
[""En streng2"", 456, 432, 4325, ""B""],
[""En streng3"", 789, 0, 7635, ""C""]";
            Console.WriteLine(s);
            //Regex re = new Regex(@"(?:\["")([A-Za-z0-9 ]*)(?:"",[ ]*)(
  • *[0-9]+)(?:,[ ]*)([-]*[0-9]+)(?:,[ ]*)([-]*[0-9]+)(?:,[ ]*"")([A-Za-z0-9 ]*)(?:""\])", RegexOptions.Singleline);
            Regex re = new Regex(@"(?:\["")([^""]*)(?:"",[ ]*)(
  • *[0-9]+)(?:,[ ]*)([-]*[0-9]+)(?:,[ ]*)([-]*[0-9]+)(?:,[ ]*"")([^""]*)(?:""\])", RegexOptions.Singleline);
            MatchCollection mc = re.Matches(s);
            foreach(Match m in mc)
            {
                Console.WriteLine(m.Groups[0].Value);
                Console.WriteLine(m.Groups[1].Value + " " +
                                  m.Groups[2].Value + " " +
                                  m.Groups[3].Value + " " +
                                  m.Groups[4].Value + " " +
                                  m.Groups[5].Value);
            }
        }
    }
}
Avatar billede hmortensen Nybegynder
23. juli 2007 - 19:24 #11
Det ser ud til at virke som det skal arne. Smider du et svar og tak for hjaelpen.
Avatar billede ranglen Nybegynder
23. juli 2007 - 19:26 #12
Hvad med anførselstegn, kan de escapes og indgå i strengen?
Avatar billede hmortensen Nybegynder
23. juli 2007 - 19:29 #13
Nej det kan de ikke.
Avatar billede hmortensen Nybegynder
23. juli 2007 - 19:33 #14
Hvad goer ([^""]*) ?
Avatar billede arne_v Ekspert
23. juli 2007 - 19:35 #15
[A-Za-z0-9 ] er bogstaver, tal og mellemrum

[^""] er alt andet end "

Da du begyndte at tale om alle de special tegn der kunne bruges saa, saa vurderede
jeg at en negativ liste var bedre end en positiv liste.
Avatar billede arne_v Ekspert
23. juli 2007 - 19:39 #16
ranglen>

Man kan ogsaa haandtere "" eller \" inden i strenge - men det bliver ikke koent.
Avatar billede arne_v Ekspert
23. juli 2007 - 19:39 #17
svar
Avatar billede kalp Novice
23. juli 2007 - 20:11 #18
Jeg lavede den løsning før jeg gik ind og spise.. postede den ikke fordi den ikke er gennemtestet:D

og det er den stadig ikke, så ved ikke hvor fool proof den er... du har alligevel fået en løsning:)

            string download = @"[""En str]-',""]eng"", 123, -32, 321, ""A""],
                                [""En stre,]ng2"", 456, 432, 4325, ""B""],
                                [""En streng3"", 789, 0, 7635, ""C""]";

            Regex pattern = new Regex(@"\[.*\]", RegexOptions.Multiline);

            MatchCollection matches = pattern.Matches(download);
            foreach (Match match in matches)
                Console.WriteLine(match.Value);

            Console.ReadLine();


jeg ved godt det er "farligt" at bruge . i sin regexp..
Avatar billede kalp Novice
23. juli 2007 - 20:12 #19
som så alligevel mangler at blive færdiggjort -- > hvis alt mellem ","'er skulle opdeles også
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