C# RegEx

second.name

Lieutenant
🎅Rätsel-Elite ’24
Registriert
Sep. 2009
Beiträge
715
Hallo Forum,
ich sitze bereits eine ganze Weile an folgendem Problem:

Es existiert ein String nach folgendem Schema: string = "[7-10], [20-30], [70]"

Aus diesem möchte ich ein Int-Array erstellen welches die Zahlenbereiche komplett enthält --> Also: 7, 8, 9, 10, 20, 21, ... 70.

Wie komme ich möglicht einfach zum passenden RegEx?

P.S.: Eine Funktion, welche aus 7-10 das Array zurückgibt, hab ich bereits gefunden, allerdings bekomme ich den String nicht zerlegt... :(
 
Im Grunde reicht dieses Pattern: /\[(\d+)(?:-(\d+))?\]/g
Die Zahlen befinden sich dann in der ersten bzw zweiten Gruppe je match. Die zwischenzahlen einfach mit einer Funktion auffüllen. wenn nur eine Zahl enthalten ist, gibt es halt nur eine gruppe im match.
siehe https://regex101.com/r/J3rg61/2
 
Zuletzt bearbeitet:
wenn das alles immer schön mit Komma getrennt ist, würde ich einfach string.split nehmen und nach dem Komma splitten und dann in int konvertieren.
 
Eckige Klammern löschen ->
Komma spliten ->
​Für jedes einzelne: Bindestrich splitten ->
​Fallunterscheidung: eine Zahl -> Zahl einfach als int hinzufügen; zwei zahlen: Schleife von Zahl1 zu Zahl2
 
Danke - das war's und jetzt klappt es - regex101.com hatte ich nicht mehr gefunden. :daumen:

(Die Formatierung des Strings kann ich nicht beeinflussen.)

Danke. :)
 
Achso. Ich hatte das so verstanden, dass eine beliebige Zahl aus dem Bereich 7-10 vorkommen kann. Du scheinst aber recht zu haben.
 
Code:
 class Program
    {
        static void Main(string[] args)
        {
            string ranges = "[7-10], [20-30], [70]";

            string[] rangesArray = ConvertStringToFormattedArray(ranges);
            var allValues = GetValues(rangesArray);

            foreach(var val in allValues)
            {
                Console.Write(val + " ");
            }
            Console.ReadKey();
        }

        public static IEnumerable<int> GetValues(string[] ranges)
        {
            List<int> returnCollection = new List<int>();

            foreach(string s in ranges)
            {
                if (s.Contains("-"))
                {
                    string[] startEndValue = s.Split('-');

                    bool parsedStartValueSuccess = int.TryParse(startEndValue[0], out int startValue);
                    bool parsedEndValueSuccess = int.TryParse(startEndValue[1], out int endValue);
                    if (parsedEndValueSuccess == false || parsedStartValueSuccess == false )
                    {
                        throw new ArgumentException($"Invalid Range: {s}");
                    }

                    for (int i = startValue; i <= endValue; i++)
                    {
                        returnCollection.Add(i);
                    }
                }
                else
                {
                    bool parsedValueSuccess = int.TryParse(s, out int value);

                    if(parsedValueSuccess == false )
                    {
                        throw new ArgumentException($"Invalid Value: {s}");
                    }

                    returnCollection.Add(value);
                }
            }
            return returnCollection;
        }

        public static string[] ConvertStringToFormattedArray(string input)
        {
            string[] rangesArray = input.Split(',');

            for (int i = 0; i < rangesArray.Length; i++)
            {
                rangesArray[i] = rangesArray[i].Replace("[", string.Empty).Replace("]", string.Empty);
            }
            return rangesArray;
        }

    }

Hier mal quick und dirty ohne RegEx. Naming und so hab ich jetzt nicht drauf geachtet und geht wahrscheinlich auch einfacher. Sollte aber gehen.
 
Zurück
Oben