Avatar billede niffer Nybegynder
01. april 2008 - 10:32 Der er 21 kommentarer

Hjælp til regular expression..

Hej
jeg har brug for et metode hvor jeg kan dele en tekst op i sætninger.

F.eks. Dette her er bare en test. Testen er kun til for at vise hvad den skal gøre. Det er ca. 200 poing til den som kan hjælpe.

1: Dette her er bare en test.
2: Testen er kun til for at vise hvad den skal gøre.
3: Det er ca. 200 poing til den som kan hjælpe.

Til dette har jeg brugt følgende:
RegexObj = new Regex([a-z][.*][ ][A-Z], ....)

Den metode virker fint, men ikke hvis der f.eks. er to mellemrum.


Nogle som kan hjælpe med dette?
Avatar billede kalp Novice
01. april 2008 - 10:36 #1
hvis du skal splitte op så du får alle ordene.. så er det da vidst nemmere, at gøre sådan istedet

string tekst = "Dette her er bare en test";
string[] ord = tekst.Split(' ');
Avatar billede nielle Nybegynder
01. april 2008 - 11:25 #2
Noget i denne stil?

            string tekst = "F.eks. Dette her er bare en test. Testen er kun til for at vise hvad den skal gøre. Det er ca. 200 poing til den som kan hjælpe.";
           
            string[] linjeArr = Regex.Split(tekst, @"(?<=\.) ");
            foreach (string linje in linjeArr)
            {
                Console.WriteLine(linje);
            }

Læg dog mærke til at der er et lille problem omkring forkortelser som f.eks. "ca.".
Avatar billede niffer Nybegynder
01. april 2008 - 11:37 #3
kalp: Det er ikke alle ord jeg vil have splittet op. Det er en hel sætning.

Det jeg har nu virker næsten fint. Det som jeg manger er hvordan jeg os får den til at tage mere end et mellemrum.

Det er selve denne string som jeg har brug for hjælp til "[a-z][.*][ ][A-Z]".

Den metode jeg som bruger nu har et par fordele. En normal sætning slutter med punktum og starter normal med et stort bogstav. Der for hvis der er ca. i sætningen vil dette ikke betyde noget da orderet efter ca. ikke starter med et stort bogstav.
Avatar billede nielle Nybegynder
01. april 2008 - 11:42 #4
Hvis der kan være mere end et mellemrum, så skal mønsteret modifiseres til:

string[] linjeArr = Regex.Split(tekst, @"(?<=\.) +");
Avatar billede nielle Nybegynder
01. april 2008 - 11:47 #5
Din egen regexp ser noget "sjov" ud:

F.eks. betyder dette delmønster:

[.*] - det samme som "et af de to tegn '.' eller '*'".

Dette er ikke det samme som hvis du bare havde skrevet:

.*

- som er det jeg gætter på at du mente.

[ ] - Her kan de to [...] simpelthen bare udelades. Den betyder simpelthen "et af de vilkårlige tegn ' '" - hvilket ikke rigtigt giver nogen mening når der faktisk kun er et enkelt tegn imellem [...]'erne.
Avatar billede niffer Nybegynder
01. april 2008 - 12:52 #6
hehe ja nu når du siger det.
Det er fordi jeg har prøvet at lidt forskelligt måder, for at se om jeg kunne få det til at virke.

Det er denne her jeg starte med "[a-z]. [A-Z]"
Avatar billede nielle Nybegynder
01. april 2008 - 13:03 #7
Jeg kan nu ikke lige se hvorfor at den skulle virke hvis du ville matche hele sætninger. Den matcher nemlig:

Et vilkårligt af bogsatverne 'a' til 'z', efterfulgt af et *vilkårligt* tegn, efterfulgt af et mellemrum, efterfulgt af et vilkårligt af bogstaverne 'A' til 'Z'.

Eksempler.

a@ A
z1 A
aa Z

Foruden at der ikke er en eneste af dine sætningsr som ser sådan ud, så begrænser den også dine sætninger til at være præcis 4 tegn lange.
Avatar billede nielle Nybegynder
01. april 2008 - 13:04 #8
Har du ellers fået kigget på 01/04-2008 11:25:18 med modifikationen fra 01/04-2008 11:42:07 ?
Avatar billede niffer Nybegynder
01. april 2008 - 13:45 #9
ja jeg kigget på den sidste du lavet. men den tager ca. med.

Ja den søger efter en f.eks  "a. A"
Det jeg så få er på hvad for en position den starter på.
Skal nemlig kun bruge position hvor sætningen slutter og hvor den ny starter.

Ved godt det virker lidt indviklet.

            segRegexObj = new Regex("([a-z][.*][ ][A-Z])", options);


                Match m = segRegexObj.Match(@"Dette her er bare en test. Testen er kun til for at vise hvad den skal gøre. Det er ca. 200 poing til den som kan hjælpe.");
                int LastPos = 0;
                while (m.Success)
                {

                    seqCound++;

                    int NewToPos = (LastPos + (m.Index - LastPos + (m.Length - 1)));

            Consol.writeline("From: "+ LastPos.Tostring() + " To: "+NewToPos.ToString());

           
                    LastPos = m.Index + m.Length - 1;
                    // get next match
                    m = m.NextMatch();
                }
Avatar billede md_craig Nybegynder
01. april 2008 - 13:56 #10
Hvis det kun er steder med flere mellemrum der bugger dig lige nu, så må det være hvis du har "a.  B" ikke?, så kan du:

segRegexObj = new Regex("([a-z][.*][ ]*[A-Z])", options);

Men ja, en noget spøjs regex til at identificere sætninger
Avatar billede nielle Nybegynder
01. april 2008 - 13:57 #11
Sådan, så skulle problemet omkring "ca." også være fikset:

            string tekst = "F.eks. Dette her er bare en test. Testen er kun til for at vise hvad den skal gøre. Det er ca. 200 poing til den som kan hjælpe.";
           
            string[] linjeArr = Regex.Split(tekst, @"(?<=\.) +(?=[A-ZÆØÅ])");
            foreach (string linje in linjeArr)
            {
                Console.WriteLine("|" + linje + "|");
            }
Avatar billede md_craig Nybegynder
01. april 2008 - 13:59 #12
og hvis "Dette kald stream.Position. Skulle ikke gerne dele sætningen. Således at der kommer 4 linier her." skal blive til:

1. Dette kald stream.Position.
2. Skulle ikke gerne dele sætningen.
3. Således at der kommer 4 linier her.

Så prøv med:

segRegexObj = new Regex("([a-z][.*][ ]+[A-Z])", options); (mener jeg det er, + siger der skal være en eller flere af et tegn)
Avatar billede nielle Nybegynder
01. april 2008 - 14:00 #13
md_craig> Det ville nok være mere hensigtsmæssigt at bruge et '+' i stedet for et '*'. Men bortset fra det så er mønstret i forven problematisk.

Det ville værer bedre med:

segRegexObj = new Regex("([a-zæøå]\. +[A-ZÆØÅ])", options);
Avatar billede nielle Nybegynder
01. april 2008 - 14:02 #14
Personlig bryder jeg mig nu ikke om den løsning eftersom at den betyder at man skal ud i index-gymnastik á la:

    ...
    int NewToPos = (LastPos + (m.Index - LastPos + (m.Length - 1)));
    Consol.WriteLine("From: "+ LastPos.Tostring() + " To: "+NewToPos.ToString());
    ...
Avatar billede niffer Nybegynder
01. april 2008 - 14:14 #15
md_craig: jo det kunne godt være jeg skulle have kaldt det noget andet. Men som overskriften lyder på så er det os det som er mit problem.

Det eneste jeg skal bruge er start pos og end pos for hver sætning.

Prøver lige de forskellige svar.
Avatar billede nielle Nybegynder
14. april 2008 - 07:44 #16
Er du kommet vidre med denne her?
Avatar billede nielle Nybegynder
21. april 2008 - 17:01 #17
??
Avatar billede nielle Nybegynder
28. april 2008 - 19:35 #18
Svar?
Avatar billede niffer Nybegynder
28. april 2008 - 20:42 #19
ja det virker perfekt :)

noget helt andet er hvis jeg os vil have den skal dele ved "?"
Avatar billede nielle Nybegynder
29. april 2008 - 06:49 #20
Kan du give nogle eksempler på hvad du ønsker?
Avatar billede nielle Nybegynder
13. maj 2008 - 22:59 #21
??
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