Avatar billede marduk666 Nybegynder
26. juli 2004 - 21:41 Der er 24 kommentarer og
1 løsning

RegExp Problemmer

jeg har en streng:
"
sdfgwetg
wrgwrgtwert

wergtwet
wetwetwt

wtgwerytwert
wregtwert
"

Her er min RegExp: "([a-z]+)\n([a-z]+)"
Jeg burde få 3 resultater men den forstår åbenbart ikke \n i mellem de to a-z?

Hvad gør jeg galt?
Avatar billede marduk666 Nybegynder
26. juli 2004 - 21:53 #1
Nåh ja forresten, jeg henter den streng fra en fil:

StreamReader x = new StreamReader("a.txt", System.Text.Encoding.Default);
string file = x.ReadToEnd();

Hvis det gør nogen forskel :-)
Avatar billede arne_v Ekspert
26. juli 2004 - 22:01 #2
Prøv:

"([a-z]+)\\n([a-z]+)"
Avatar billede marduk666 Nybegynder
26. juli 2004 - 22:14 #3
Har jeg prøvet, den ville heller ikke :-/
Avatar billede arne_v Ekspert
26. juli 2004 - 22:24 #4
Mystisk.

Dit original udtryk virker hos mig.

using System;
using System.Text.RegularExpressions;

class MainClass
{
    public static void Main(string[] args)
    {
        test("a\nb");
        test("a\nb\nc\nd");
        test("a");
    }
    private static void test(string s)
    {
        Console.WriteLine(s.Replace('\n','*') + " has:");
        MatchCollection res = Regex.Matches(s,"([a-z]+)\n([a-z]+)");
        for(int i = 0; i < res.Count; i++) {
            Console.Write(" " + res[i].Groups[0].ToString().Replace('\n','*'));
        }
        Console.WriteLine();
    }
}
Avatar billede arne_v Ekspert
26. juli 2004 - 22:24 #5
Jeg bruger kun .Replace('\n','*') for at gøre print lidt mere letlæseæligt.
Avatar billede marduk666 Nybegynder
26. juli 2004 - 22:34 #6
Ja hvis jeg laver en streng så vil den godt, men hvis jeg henter det fra en fil vil den ikke.
Avatar billede arne_v Ekspert
26. juli 2004 - 22:35 #7
Har du prøvet med \r\n hvis nu filen indeholder det ?
Avatar billede marduk666 Nybegynder
26. juli 2004 - 22:39 #8
Ja, det virker heller ikke :/
Avatar billede sovsekoder Nybegynder
26. juli 2004 - 22:50 #9
hver linie slutter med "carriage return" og "line feed". Dette kan skives som \r\n eller \x0d\x0a, dvs:

"([a-z]+)\\x0d\\x0a([a-z]+)" eller. "([a-z]+)\\r\\n([a-z]+)"

skulle løse problemet
Avatar billede sovsekoder Nybegynder
26. juli 2004 - 22:52 #10
hmm havde ikke set de tidligere kommentarer... sry bare en gentagelse... (men måske var det værd at tjekke \\r\\n?)
Avatar billede arne_v Ekspert
26. juli 2004 - 22:56 #11
"([a-z]+)\r\n([a-z]+)"

virker hos mig ????
Avatar billede arne_v Ekspert
26. juli 2004 - 22:56 #12
using System;
using System.IO;
using System.Text.RegularExpressions;

class MainClass
{
    public static void Main(string[] args)
    {
        test("a\nb");
        test("a\nb\nc\nd");
        test("a");
        test((new StreamReader(File.OpenRead("C:\\z.dat")).ReadToEnd()));
    }
    private static void test(string s)
    {
  Console.WriteLine("---> " + s);
        Console.WriteLine(s.Replace('\n','*') + " has:");
        MatchCollection res = Regex.Matches(s,"([a-z]+)\\r\\n([a-z]+)");
        for(int i = 0; i < res.Count; i++) {
            Console.Write(" " + res[i].Groups[0].ToString().Replace('\n','*'));
        }
        Console.WriteLine();
    }
}
Avatar billede arne_v Ekspert
26. juli 2004 - 22:56 #13
aaa
bbb
ccc
ddd
has:
0 : aaa
bbb
1 : ccc
ddd
Avatar billede arne_v Ekspert
26. juli 2004 - 22:59 #14
Du har vel ikke nogen mellemrum i filen ?
Avatar billede roenving Novice
26. juli 2004 - 23:07 #15
Har du

  Regex.multiLine = true ?-)
Avatar billede arne_v Ekspert
26. juli 2004 - 23:15 #16
System.Text.RegularExpressions.Regex har ikke nogen multiLine

Man kan sætte MultiLine i Options men det vil næppe hjælpe.

Fra docs:

Multiline
Supported by the .NET Compact Framework.
Multiline mode. Changes the meaning of ^ and $ so they match at the beginning and end, respectively, of any line, and not just the beginning and end of the entire string.
Avatar billede arne_v Ekspert
26. juli 2004 - 23:16 #17
Det var iøvrigt forkert kode jeg fik pastet ind.

Den kode som svarer til outputtet er:

using System;
using System.IO;
using System.Text.RegularExpressions;

class MainClass
{
    public static void Main(string[] args)
    {
        test((new StreamReader(File.OpenRead("C:\\z.dat")).ReadToEnd()));
    }
    private static void test(string s)
    {
        Console.WriteLine(s + "\n has:");
        MatchCollection res = Regex.Matches(s,"([a-z]+)\r\n([a-z]+)");
        for(int i = 0; i < res.Count; i++) {
            Console.WriteLine(i + " : " + res[i].Groups[0].ToString());
        }
        Console.WriteLine();
    }
}

(det andet var lidt eksperimenteren)
Avatar billede marduk666 Nybegynder
26. juli 2004 - 23:25 #18
Jeg er snot forvirret!

Her er min tekst fil:
aaaaa

ddddd
eeeee

ggggg
hhhhh


Resultat:
aaaaa

ddddd
eeeee

ggggg
*hhhhh has:
*hhhhh ggggg
Avatar billede marduk666 Nybegynder
26. juli 2004 - 23:28 #19
Nu får jeg:
0 : ddddd
eeeee
1 : eeeee
hhhhh

Med samme tekst fil.
Avatar billede marduk666 Nybegynder
26. juli 2004 - 23:36 #20
OK, Jeg har denne her:

namespace ConsoleApp
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            StreamReader x = new StreamReader("C:\\a.txt", System.Text.Encoding.Default);
            string s = x.ReadToEnd();

            int count = 0;
            MatchCollection res = Regex.Matches(s, "\r\n");
            for ( int i = 0; i < res.Count; i++ )
            {
                s = s.Replace(res[i].Groups[0].ToString(), "*\n");
                count++;
            }
            Console.WriteLine("Der var "+count+" Erstatninger.\n\n");
            Console.WriteLine(s);

            Console.ReadLine();
        }
    }
}

Den virker 100% med kun "\r\n" men når jeg smider ([a-z]+)\r\n([a-z]+) ind i stedet, så går der ged i det!
Avatar billede marduk666 Nybegynder
27. juli 2004 - 12:17 #21
Jeg har denne her streng:
oiwejrgwag

wgpwojgwgsfg
wgoiwjgp

wgpoiwjg

gpw9ijfggpgfg
dbondfkjbn

dfboksdfgio

ertojrgsåfdf


Menningen er at den skal godtage det som en erstatning hvis der er 1 linje eller 2 hovr linjerne indeholder noget udover et linjeskift, Dvs. med overstående streng får jeg 6 erstatninger:

Første:
oiwejrgwag

Anden:
wgpwojgwgsfg
wgoiwjgp

Tredje:
wgpoiwjg

Fjerde:
gpw9ijfggpgfg
dbondfkjbn

Femte:
dfboksdfgio

Sjette:
ertojrgsåfdf
Avatar billede arne_v Ekspert
27. juli 2004 - 12:23 #22
Skal dit udtryk så ikke være:

([a-z]+\r\n\r\n)|([a-z]+\r\n[a-z]+\r\n\r\n)

?

en linie efterfulgt af en tom linie eller to linier efterfulgt af en tom linie
Avatar billede marduk666 Nybegynder
27. juli 2004 - 13:12 #23
Ja! Det var det jeg søgte, smid et svar.
Avatar billede arne_v Ekspert
27. juli 2004 - 13:19 #24
ok
Avatar billede marduk666 Nybegynder
27. juli 2004 - 13:37 #25
Du får lidt flere point :P
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