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...
Annonceindlæg fra Arctic Wolf
21. november 2004 - 23:46
#1
jeg ville undre mig hvis det ikke var arne_v som gav det første svar.. :)
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 !
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++ ??
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.
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 :)
22. november 2004 - 00:42
#6
Min Borland Builder 5.0 har en regexp.h der definerer en TRegexp class.
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; }
22. november 2004 - 01:15
#8
ok.. jeg kigger på det... sidder lige midt i et loop, jeg skal programmere .....
22. november 2004 - 09:28
#9
Men det var lidt praktisk i denne sammenhæng hvis den kunne hive grupper ud.
22. november 2004 - 16:02
#10
arne_v >> mener du at bertelbranders svar ikke havde grupper ?
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.
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++
26. november 2004 - 19:22
#13
arne_v bare giv et svar :)
26. november 2004 - 19:42
#14
OK men kunne du bruge det til noget ?
29. november 2004 - 00:05
#15
jeg har ikke fundet noget som understøtter grupper til C++ endnu..
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(); }
29. november 2004 - 00:26
#17
29. november 2004 - 00:27
#18
Men det ser ikke helt nemt ud ...
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 ?
29. november 2004 - 00:38
#20
jeg tror jeg fandt fejlen TRegexp Regexp("[function]+[(]+[^\"]+[)]+[;]");
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 ??
29. november 2004 - 22:34
#22
suk - det anede mig at det spørgsmå ville komme ...
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; }
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 = ;
30. november 2004 - 00:02
#25
Og jeg kan ikke få det til at builde med Borland C/C++ 5.5 ...
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 ??
04. december 2004 - 19:42
#27
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)
04. december 2004 - 19:52
#29
jeg har lavet en fil reg_exp.cpp, som jeg #include "reg_exp.cpp" for at teste...
04. december 2004 - 20:00
#30
Prøv og drop den #include !
04. december 2004 - 20:04
#31
det kan jeg jo ikke.. det er der parse() kommer fra...
04. december 2004 - 20:05
#32
Så laver du en reg_exp.h som definerer men ikke implementerer parse (og andre) og inkluderer den.
04. december 2004 - 20:08
#33
giv du bare et svar arne..... og andre, hvis deres point diæt er kommet til bedre munde...
04. december 2004 - 20:11
#34
Jeg lagde svar allerede 26/11. Du fik det til at compile med en .h fil ?
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.
Kurser inden for grundlæggende programmering