PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regex zur Parameter auslesung


Gordo
23.08.2007, 15:53
Hallo Leute!
Ich habe eine (hoffentlich) einfache Frage - Ich beschäftige mich nicht oft mit
Regex aber heute brauche ich es einmal.. Es geht darum:

Ich bekomme einen Sql string übergeben und muss daraus die Parameter auslesen

Bsp:
EXECUTE [CreateMultilingualFeature]@Lang,'Ereignisursache','EventCausation','idEventCausation','bpcm.EventCausation','SysKey','SetUpMode',null,'Description',@Param2153 EXECUTE [CreateMultilingualFeature]@Lang,'Ereignisursache','EventCausation','idEventCausation','bpcm.EventCausation','SysKey','MachineProblem',null,'Description',@Param2154

Die Parameter sin alle die die mit @ beginnen... nun soll ich die auslesen und in form einer
List<string> zurückgeben - was mir bisher eingefallen ist sieht so aus

public static List<string> GetParameternames(string strSql) {
List<string> AllParameters = new List<string>();

Regex rx = new Regex(@"(@)(\w+)");
MatchCollection Matches = rx.Matches(strSql);

foreach (Match Param in Matches) {
AllParameters.Add(Param.Groups[2].ToString());
}
return AllParameters;
}


zurückbekommen muss ich in dem fall Lang, Param2153, Lang und Param2154

was ich nun frage ist, ob man das auch ohne Groups machen kann um die Werte ohne @ zu bekommen?

In Hoffnung auf konstruktive Antwort
Gordo ;)


eViL_oNe
25.08.2007, 22:13
du könntest eigentlich auf die erste Gruppe verzichten, denn eigentlich interessiert nur der Name des Parameters.

Der richtige Ausdruck wäre folglich

@(\w+)

im prinzip kann man das ganze auch ohne Gruppen machen. Du kannst den kompletten Capture-Wert abfragen (geht wohl über System.Text.RegularExpressions.Match.Value) und dann manuell um das erste Zeichen befreien (String.Substring, aber das müsstest du eigentlich auch selber wissen *gg*). Es erscheint mir allerdings zweifelhaft, wozu man dies tun sollte, wenn auch die Regex-Engine dies übernehmen kann ;)

Gordo
27.08.2007, 08:05
Vielen Dank für die Antwort...

Ich habe in der Zeit allerdings so lange geforscht bis ich ein Beispiel zu einer
Assertion gefunden habe! Die sieht wie folgt aus (?<=@)\w+ . Und dieser Regex dursucht meinen String nach einem @ und nimmt sich den wert \w+ der darauf folgt =)

lg
Patrick

eViL_oNe
29.08.2007, 23:49
hmmm -- wenn du mir noch den Sinn erklären kannst, warum man bei dieser trivialen Geschichte einen positive look-ahead braucht und sich nicht mit einer trivialen Lösung begnügt, wäre ich dir dankbar *g*

Das Ergebnis ist in jedem Fall äquivalent zu

@(\w+), mit dem Unterschied, dass bei dir im kompletten Capture-Wert das drinsteht, was bei mir in der ersten Capture-Group steht *g*

Gordo
30.08.2007, 07:59
naja eigentlich ist es so nur ein wenig besser in der performance^^ das das ein positive look-ahead ist wusste ich nicht da das thema regex für mich noch ziemlich neu ist^^ ich dachte mir eigentlich nur so brauch ich die gruppen nicht und ein schritt im programm fällt weg ;)

lg

eViL_oNe
30.08.2007, 08:48
naja, das müsste man mal analysieren -- ich denke, dass look-ahead mehr kostet als eine Capture-Group, vielleicht hast du ja Lust beides mit langen Strings mal zu benchmarken? Würde mich mal interessieren *ggg*

was sich natürlich nicht von der hand weisen lässt -- benutzt man Groups wird mehr Speicher veranlangt *g*

eViL_oNe
30.08.2007, 09:25
ein kleiner eigener Test hat mir gezeigt, dass lookahead zumindest in .NET tatsächlich langsamer ist als capture groups -- wobei ich die Ergebnisse nicht auf jede Konstellation übertragen will *g*


class Program
{
private const string textToMatch =
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70" +
"@param1,value1,@param2,value2,@param3,value3,@param4,value4,@param5,value5,@param6,value6,@param7,value7,@param8,value8,@param9,value9,@param10,value10,@param11,value11,@param12,value12,@param13,value13,@param14,value14,@param15,value15,@param16,value16,@param17,value17,@param18,value18,@param19,value19,@param20,value20,@param21,value21,@param22,value22,@param23,value23,@param24,value24,@param25,value25,@param26,value26,@param27,value27,@param28,value28,@param29,value29,@param30,value30,@param31,value31,@param32,value32,@param33,value33,@param34,value34,@param35,value35,@param36,value36,@param37,value37,@param38,value38,@param39,value39,@param40,value40,@param41,value41,@param42,value42,@param43,value43,@param44,value44,@param45,value45,@param46,value46,@param47,value47,@param48,value48,@param49,value49,@param50,value50,@param51,value51,@param52,value52,@param53,value53,@param54,value54,@param55,value55,@param56,value56,@param57,value57,@param58,value58,@param59,value59,@param60,value60,@param61,value61,@param62,value62,@param63,value63,@param64,value64,@param65,value65,@param66,value66,@param67,value67,@param68,value68,@param69,value69,@param70,value70";

private static Regex lookAhead = new Regex("(?<=@)\\w+");
private static Regex groups = new Regex("@(\\w+)");

static void Main(string[] args)
{
DateTime start = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
Test1();
}
Console.WriteLine("elapsed time look ahead: {0}", DateTime.Now - start);

DateTime start2 = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
Test2();
}
Console.WriteLine("elapsed time groups: {0}", DateTime.Now - start2);
}

private static void Test2()
{
foreach (Match m in groups.Matches(textToMatch))
{
string matchedText = m.Groups[1].Value;
}
}

private static void Test1()
{
foreach (Match m in lookAhead.Matches(textToMatch))
{
string matchedText = m.Value;
}
}

Gordo
31.08.2007, 08:10
Hallo,
Hatte jz Urlaub für 2 Tage und mir is bei Gott nicht eingefallen wie dieses forum schnell heißt ;)

Das ist sehr interessant! Ich werds mir evtl auch mal ansehen wenn ich Zeit hat *UnterStressSteht* =(

Danke für deine Bemühungen
Gordo