Mehrere Bereiche in Test erkennen

CopWorker

Erfahrenes Mitglied
Hallo zusammen,
ich steck mal wieder feste.

Folgenden String Inhalt verwende ich:
string strDataName = "AlmRfg(4)AlmGrp(27)AlmCode(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)IgnPos(0,11,12,13,14,15)InvPos(0)";

Ich kann die einzelnen Bereiche z.Bsp.: AlmCode(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) bereits ausfiltern und die
Inhalte in der Klammer in ein Array splitten.
Alles kein Problem:

Bis jetzt bilde ich 4 Pattern weil ich es in einer Zeile nicht schaffe.
C#:
mTemp = Regex.Match(tagdata.strDataName, @"(\s*AlmGrp\((?'group'[\d,]+)\)\s*)");
if (mTemp.Success && mTemp.Groups["group"].Success)
   liGroupTemp = mTemp.Groups["group"].Value?.Split(',')?.Select(Int32.Parse)?.ToArray();

mTemp = Regex.Match(tagdata.strDataName, @"(\s*AlmCode\((?'code'[\d,]+)\)\s*)");
if (mTemp.Success && mTemp.Groups["code"].Success)
   liCodeTemp = mTemp.Groups["code"].Value?.Split(',')?.Select(Int32.Parse)?.ToArray();

mTemp = Regex.Match(tagdata.strDataName, @"(\s*IgnPos\((?'pos'[\d,]+)\)\s*)");
if (mTemp.Success && mTemp.Groups["pos"].Success)
   liPosTemp = mTemp.Groups["pos"].Value?.Split(',')?.Select(Int32.Parse)?.ToArray();

mTemp = Regex.Match(tagdata.strDataName, @"(\s*InvPos\((?'inv'[\d,]+)\)\s*)");
if (mTemp.Success && mTemp.Groups["inv"].Success)
   liInvTemp = mTemp.Groups["inv"].Value?.Split(',')?.Select(Int32.Parse)?.ToArray();

Meine Frage:
Kann ich die 4 Pattern in ein 1 Pattern zusammenfassen?
Mein Versuch ist gescheitert:
C#:
mTemp = Regex.Match(tagdata.strDataName, @"((\s*AlmGrp\((?'group'[\d,]+)\))(AlmCode\((?'code'[\d,]+)\))(IgnPos\((?'pos'[\d,]+)\))(InvPos\((?'inv'[\d,]+)\)\s*))");

Was ist da falsch, bzw. geht so was überhaupt?

Vielen Dank.
Gruß CopWorker
 
(\s*AlmGrp\((?'group'[\d,]+)\)
Ich dachte das Suchkriterium ist das Wort AlmGrp und der wert soll in der dranhängenden Klammer (27) über den Parameter 'group' zurückgegeben werden
-> if (mTemp.Success && mTemp.Groups["code"].Success)

So funktioniert das auch wenn die Pattern einzeln nacheinander aufgerufen werden.

Gruß CopWorker
 
Arrggghh.... named Groups...funzt wahrscheinlich deshalb nicht, weil das Pattern immer ein "doppeltes" Resultat zurückgibt.
Deshalb habe ich keine named Groups verwendet, sondern einfach Index-basierter Zugriff.
Schau dir mein Beispiel in dem Regex-Link an (wobei ich nach allen 5 Pattern suche, anstatt nur nach 4 --> Bei dir fehlt AlmRfg?))
Ich bekomme 10 Groups zurück, und das was du suchst ist in den "ungeraden" Gruppen

Check mal deine "einzelnen" Gruppen, wieviele du denn tatsächlich zurück bekommst. Würde mich nicht wundern, wenn es immer zwei sind statt einer

EDIT: Habs
regex101: build, test, and debug regex
Du hattest fast recht mit deinem Versuch. Du hattest nur ein Paar Klammern an der falschen Stelle
Code:
\s*AlmGrp\((?'group'[\d,]+)\)\s*AlmCode\((?'code'[\d,]+)\)\s*IgnPos\((?'pos'[\d,]+)\)\s*InvPos\((?'inv'[\d,]+)\)\s*
die "\s*" zwischen den Pattern kannste auch weglassen, sofern nicht noch irgendwelche Whitespaces dort auftauchen können

EDIT2: Hier für alle 5
regex101: build, test, and debug regex
Code:
\s*AlmRfg\((?'rfg'[\d,]+)\)\s*AlmGrp\((?'group'[\d,]+)\)\s*AlmCode\((?'code'[\d,]+)\)\s*IgnPos\((?'pos'[\d,]+)\)\s*InvPos\((?'inv'[\d,]+)\)\s*
 
Zuletzt bearbeitet:
So funktionierts im Debugger doch ganz ordentlich:
Ich versteh bloß nicht wie ich den Link vom Debugger Test hier rein bringen kann, egal.
C#:
\s*AlmGrp\((?'group'[\d,]+)\)AlmCode\((?'code'[\d,]+)\)IgnPos\((?'pos'[\d,]+)\)InvPos\((?'inv'[\d,]+)\)\s*
In meinem C# Projekt bleibt der Match Erfolg aus.
Schade.
Trotzdem vielen Dank für die Hilfe.
Gruß CopWorker
 
So funktionierts im Debugger doch ganz ordentlich:
Ich versteh bloß nicht wie ich den Link vom Debugger Test hier rein bringen kann, egal.
C#:
\s*AlmGrp\((?'group'[\d,]+)\)AlmCode\((?'code'[\d,]+)\)IgnPos\((?'pos'[\d,]+)\)InvPos\((?'inv'[\d,]+)\)\s*
In meinem C# Projekt bleibt der Match Erfolg aus.
Schade.
Trotzdem vielen Dank für die Hilfe.
Gruß CopWorker
Dir ist bekannt, das regex101 auch nen Code-Generator für C# hat?

C#:
using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @/
\s*AlmGrp\((?'group'[\d,]+)\)\s*AlmCode\((?'code'[\d,]+)\)\s*IgnPos\((?'pos'[\d,]+)\)\s*InvPos\((?'inv'[\d,]+)\)\s*
/;
        string input = @"AlmRfg(4)AlmGrp(27)AlmCode(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)IgnPos(0,11,12,13,14,15)InvPos(0)";
        RegexOptions options = RegexOptions.Multiline;
        
        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}
 
Hallo Zvoni,

ich habe dein Bespiel verwendet.
So hatte ich das auch bereits drin außer mit den Wiederholungen "\s*".

Irgendwie komisch.
Gruß CopWorker
 

Neue Beiträge

Zurück