Avatar billede Daniel.E Praktikant
21. november 2004 - 23:39 Der er 34 kommentarer og
1 løsning

reg exp

hej

jeg skal bruge et reg exp ustryk, og det skal være reg exp !!!

betrakt følgende:

_func "hej";

hvis man skal have et udtryk som udtrækker det sådan her, til nogle variabler:

1)
_func

2)
"";

3)
hej

Del nummer 1, "_func" kan være andet end "_func", det kunne være, "_Myfunc".

Meningen med denne herlighed er at jeg vil lave noget syntax highligtning.

bare sprøg hvis det lyder underligt...
Avatar billede Daniel.E Praktikant
21. november 2004 - 23:46 #1
jeg ville undre mig hvis det ikke var arne_v som gav det første svar.. :)
Avatar billede arne_v Ekspert
21. november 2004 - 23:53 #2
Umiddelbart virker

([a-zA-Z_][a-zA-Z_0-9]*)(?: )(")([^"]*)(")(;)

interessant.

Følgende C# kode (beklager - ikke C++):

using System;
using System.Text.RegularExpressions;

public class Test {
    public static void Parse(string s)
    {
        Console.WriteLine(s);
        MatchCollection res = Regex.Matches(s,"([a-zA-Z_][a-zA-Z_0-9]*)(?: )(\")([^\"]*)(\")(;)");
        for(int i = 0; i < res.Count; i++) {
            Console.WriteLine("func=" + res[i].Groups[1]);
            Console.WriteLine("stringsep=" + res[i].Groups[2]);
            Console.WriteLine("string=" + res[i].Groups[3]);
            Console.WriteLine("stringsep=" + res[i].Groups[4]);
            Console.WriteLine("statementsep=" + res[i].Groups[5]);
        }
    }
    public static void Main(string[] args) {
        Parse("a \"aa\";");
        Parse("b \"bb bb\";");
    }
}

udskriver:

a "aa";
func=a
stringsep="
string=aa
stringsep="
statementsep=;
b "bb bb";
func=b
stringsep="
string=bb bb
stringsep="
statementsep=;

og det ser vel ikke helt skævt ud !
Avatar billede Daniel.E Praktikant
22. november 2004 - 00:12 #3
Hej arne_v

MatchCollection res = Regex.Matches(s,"([a-zA-Z_][a-zA-Z_0-9]*)(?: )(\")([^\"]*)(\")(;)");

ved du hvordan man gør dette i C++ ??
Avatar billede bertelbrander Novice
22. november 2004 - 00:18 #4
Nogle kompilere har regexp men det er ikke standard.
Er det linux ?
Der ligger en regexp på min hjemmeside.
Avatar billede Daniel.E Praktikant
22. november 2004 - 00:30 #5
jeg har tænkt mig at lave det i Borland Builder 6,0. et lille program til at vise mit script pænt i :)
Avatar billede bertelbrander Novice
22. november 2004 - 00:42 #6
Min Borland Builder 5.0 har en regexp.h der definerer en TRegexp class.
Avatar billede bertelbrander Novice
22. november 2004 - 00:48 #7
F.ex:

#include <regexp.h>
#include <iostream>

int main()
{
  TRegexp Regexp("[0-9]+");
  size_t Len;
  size_t Idx = Regexp.find("This is some text 123 with a number", &Len);
  std::cout << "Your text was found at: " << Idx << ", Length: " << Len << std::endl;
}
Avatar billede Daniel.E Praktikant
22. november 2004 - 01:15 #8
ok.. jeg kigger på det... sidder lige midt i et loop, jeg skal programmere .....
Avatar billede arne_v Ekspert
22. november 2004 - 09:28 #9
Men det var lidt praktisk i denne sammenhæng hvis den kunne hive grupper ud.
Avatar billede Daniel.E Praktikant
22. november 2004 - 16:02 #10
arne_v >> mener du at bertelbranders svar ikke havde grupper ?
Avatar billede arne_v Ekspert
22. november 2004 - 17:05 #11
"[0-9]+" har ingen grupper og jeg checkede regexp.h og det så ikke ud som
at TRegexp har support for grupper.
Avatar billede bertelbrander Novice
22. november 2004 - 22:43 #12
Så vidt jeg kan se har Arne ret. Så hvis du vil bruge Borlands indbyggede bliver du nok nødt til at lave en reg. exp. for hver gruppe.

Ellers må du finde en anden regexp, jeg er ret sikker på at du kan finde en her:
http://www.boost.org/

google har 103.000 hits på: regexp C++
Avatar billede Daniel.E Praktikant
26. november 2004 - 19:22 #13
arne_v bare giv et svar :)
Avatar billede arne_v Ekspert
26. november 2004 - 19:42 #14
OK

men kunne du bruge det til noget ?
Avatar billede Daniel.E Praktikant
29. november 2004 - 00:05 #15
jeg har ikke fundet noget som understøtter grupper til C++ endnu..
Avatar billede Daniel.E Praktikant
29. november 2004 - 00:25 #16
#include <regexp.h>
#include <iostream>
#include <conio.h>

int main()
{

  TRegexp Regexp("[function]+[(]+[^\"]*+[)]+[;]");
  size_t Len;
  size_t Idx = Regexp.find("function(hej  asdsad asdsad asd);", &Len);
  std::cout << "Your text was found at: " << Idx << ", Length: " << Len << std::endl;
  getch();
}
Avatar billede arne_v Ekspert
29. november 2004 - 00:26 #17
Avatar billede arne_v Ekspert
29. november 2004 - 00:27 #18
Men det ser ikke helt nemt ud ...
Avatar billede Daniel.E Praktikant
29. november 2004 - 00:29 #19
jeg fik lige lavet følgende.. men der mangler bare lige en lille ting..
hva nu hvis:

size_t Idx = Regexp.find("function(hej  asdsad asdsad asd); function(hej  asdsad asdsad asd);", &Len);


hvis jeg gør sådna så bliver længden længere... skal længden ikke være det som det reg udtryk er ??

function(hej  asdsad asdsad asd); er 33 langt, men hvis jeg forlængere bliver taller størrer...

hva mangler jeg ??

Hvordan går jeg sådan at den søger en hel streng igennem og gemmer de forskellige start og end positioner ?
Avatar billede Daniel.E Praktikant
29. november 2004 - 00:38 #20
jeg tror jeg fandt fejlen

  TRegexp Regexp("[function]+[(]+[^\"]+[)]+[;]");
Avatar billede Daniel.E Praktikant
29. november 2004 - 01:01 #21
jeg har kigget lidt på http://www.pcre.org/..... kan du komme med et eks på hvordan man gør som i dit reg exp eks i topppen ??
Avatar billede arne_v Ekspert
29. november 2004 - 22:34 #22
suk - det anede mig at det spørgsmå ville komme ...
Avatar billede arne_v Ekspert
30. november 2004 - 00:00 #23
#include <stdio.h>
#include <string.h>
#include <pcre.h>

void parse(char *s)
{
    int i;
    pcre *re;
    int rc;
    int erroffset;
    int ovector[300];
    const char *error;
    const char *p;
    const char label[][20] = { "func", "stringsep", "string", "stringsep", "statementsep" };
    printf("%s\n",s);
    re = pcre_compile("([a-zA-Z_][a-zA-Z_0-9]*)(?: )(\")([^\"]*)(\")(;)",0,&error,&erroffset,NULL);
    rc = pcre_exec(re,NULL,s,strlen(s),0,0,ovector,sizeof(ovector)/sizeof(int));
    for(i=1;i<6;i++)
    {
        pcre_get_substring(s,ovector,rc,i,&p);
        printf("%s = %s\n",label[i-1],p);
    }
}

int main()
{
    parse("a \"aa\";");
    parse("b \"bb bb\";");
    return 0;
}
Avatar billede arne_v Ekspert
30. november 2004 - 00:01 #24
C:\>cl /I\pcre\include testpcre.c \pcre\lib\libpcre.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

testpcre.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:testpcre.exe
testpcre.obj
\pcre\lib\libpcre.lib

C:\>testpcre
a "aa";
func = a
stringsep = "
string = aa
stringsep = "
statementsep = ;
b "bb bb";
func = b
stringsep = "
string = bb bb
stringsep = "
statementsep = ;
Avatar billede arne_v Ekspert
30. november 2004 - 00:02 #25
Og jeg kan ikke få det til at builde med Borland C/C++ 5.5 ...
Avatar billede Daniel.E Praktikant
04. december 2004 - 19:38 #26
arne_v >> jamen det ser jo godt ud :)  Jeg var næsten ved at opgive med VC 6.0, og regexp...


Hvordan får jeg #include <pcre.h> fra ??
Avatar billede arne_v Ekspert
04. december 2004 - 19:42 #27
Både .h og .lib kommer med den her:
  http://gnuwin32.sourceforge.net/downlinks/pcre.php
Avatar billede Daniel.E Praktikant
04. december 2004 - 19:51 #28
kan du hjælpe med denne fejlbesked..

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
reg_exp.cpp
Linking...
reg_exp.obj : error LNK2005: "void __cdecl parse(char *)" (?parse@@YAXPAD@Z) already defined in Cpp1.obj
Debug/Cpp1.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

Cpp1.exe - 2 error(s), 0 warning(s)
Avatar billede Daniel.E Praktikant
04. december 2004 - 19:52 #29
jeg har lavet en fil reg_exp.cpp, som jeg #include "reg_exp.cpp" for at teste...
Avatar billede arne_v Ekspert
04. december 2004 - 20:00 #30
Prøv og drop den #include !
Avatar billede Daniel.E Praktikant
04. december 2004 - 20:04 #31
det kan jeg jo ikke.. det er der parse() kommer fra...
Avatar billede arne_v Ekspert
04. december 2004 - 20:05 #32
Så laver du en reg_exp.h som definerer men ikke implementerer parse (og andre)
og inkluderer den.
Avatar billede Daniel.E Praktikant
04. december 2004 - 20:08 #33
giv du bare et svar arne..... og andre, hvis deres point diæt er kommet til bedre munde...
Avatar billede arne_v Ekspert
04. december 2004 - 20:11 #34
Jeg lagde svar allerede 26/11.

Du fik det til at compile med en .h fil ?
Avatar billede arne_v Ekspert
04. december 2004 - 20:12 #35
Så vidt jeg kan så kan PCRE alt det Java og .NET regex kan og lidt til.

Interfacet er bare lidt tungere.

Men du kunne jo wrappe det i din egen C++ klasse.
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
Kurser inden for grundlæggende programmering

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