Liebes Forum,
bislang war ich stiller Mitleser und konnte nach meinem Umstieg auf vb.NET schon viel von euch mitnehmen, besten Dank dafür! Jetzt habe ich allerdings ein Problem, zu dem ich weder hier noch auf anderen Seiten eine Lösung finde (sofern es überhaupt eine gibt ...). Vielleicht bin ich gänzlich auf dem Holzweg.
Ziel: Funktion, die als Parameter eine Steuernummer im alten Format als String erhält und ins neue Bundesschema umwandelt.
Herausforderung: Altes wie neues Schema sind von Bundesland zu Bundesland verschieden. Es ist nicht bekannt, aus welchem Bundesland die Steuernummer stammt.
Aktueller Ansatz: Die Patterns der Steuernummern als Regular Expressions in zwei Arrays speichern, eines für das alte Schema, eines für das neue. Die (bereits validierte) Steuernummer wird in einer For-Schleife mit den alten Patterns verglichen. Bei einem Match soll sie mittels des neuen Patterns ins neue Schema umgewandelt werden.
Beispiel:
- strSteuernummer = "93815/08152"
- Matcht bei i = 0 mit "^(?<ff>\d{2})(?<bbb>\d{3})[/](?<uuuu>\d{4})(?<p>\d{1})$"
- patternStNrNeu(0) = "^28(?<ff>\d{2})0(?<bbb>\d{3})(?<uuuu>\d{4})(?<p>\d{1})$"
- Nun müssen alle Ziffern der jeweiligen Gruppen korrekt angeordnet als neuer String "zusammengebastelt" werden. Sprich: Die Ziffern, die vorher in der Gruppe <ff> waren, sollen auch beim neuen Pattern an der Stelle <ff> stehen.
- Rückgabewert: strSteuernummerNeu = "2893081508152"
Meine Frage: Gibt es einen einfachen, geschickten Weg Zeile 3 des obigen Codes umzusetzen?
Meine beste Idee wäre, die Gruppennamen und -werte in ein Dictionary zu speichern und dann mit einem Select Case für jedes einzelne Bundesland den neuen String händisch wieder zusammenzusetzen ... Aber das muss doch auch geschickter gehen?
bislang war ich stiller Mitleser und konnte nach meinem Umstieg auf vb.NET schon viel von euch mitnehmen, besten Dank dafür! Jetzt habe ich allerdings ein Problem, zu dem ich weder hier noch auf anderen Seiten eine Lösung finde (sofern es überhaupt eine gibt ...). Vielleicht bin ich gänzlich auf dem Holzweg.
Ziel: Funktion, die als Parameter eine Steuernummer im alten Format als String erhält und ins neue Bundesschema umwandelt.
Herausforderung: Altes wie neues Schema sind von Bundesland zu Bundesland verschieden. Es ist nicht bekannt, aus welchem Bundesland die Steuernummer stammt.
Aktueller Ansatz: Die Patterns der Steuernummern als Regular Expressions in zwei Arrays speichern, eines für das alte Schema, eines für das neue. Die (bereits validierte) Steuernummer wird in einer For-Schleife mit den alten Patterns verglichen. Bei einem Match soll sie mittels des neuen Patterns ins neue Schema umgewandelt werden.
VB.NET-Quellcode
- For i As Integer = 0 To patternStNrAlt.Length - 1 ' Array mit Regex-Patterns als Strings, eines pro Bundesland
- If Regex.Match(strSteuernummer, patternStNrAlt(i)).Success Then ' vergleicht den String mit den Patterns
- strSteuernummerNeu = 'hier soll die neue Steuernummer zusammengebaut werden
- Return strSteuernummerNeu
- End If
- Next
Beispiel:
- strSteuernummer = "93815/08152"
- Matcht bei i = 0 mit "^(?<ff>\d{2})(?<bbb>\d{3})[/](?<uuuu>\d{4})(?<p>\d{1})$"
- patternStNrNeu(0) = "^28(?<ff>\d{2})0(?<bbb>\d{3})(?<uuuu>\d{4})(?<p>\d{1})$"
- Nun müssen alle Ziffern der jeweiligen Gruppen korrekt angeordnet als neuer String "zusammengebastelt" werden. Sprich: Die Ziffern, die vorher in der Gruppe <ff> waren, sollen auch beim neuen Pattern an der Stelle <ff> stehen.
- Rückgabewert: strSteuernummerNeu = "2893081508152"
Meine Frage: Gibt es einen einfachen, geschickten Weg Zeile 3 des obigen Codes umzusetzen?
Meine beste Idee wäre, die Gruppennamen und -werte in ein Dictionary zu speichern und dann mit einem Select Case für jedes einzelne Bundesland den neuen String händisch wieder zusammenzusetzen ... Aber das muss doch auch geschickter gehen?
VB.NET-Quellcode
- Dim rgx As New Regex(patternStNrAlt(i))
- Dim match As Match = rgx.Match(strSteuernummer)
- Dim strGroupNames() As String = rgx.GetGroupNames()
- Dim dictGroupZiffern As New Dictionary(Of String, String)
- For j As Integer = 0 To strGroupNames.Length - 1
- Dim grp As Group = match.Groups.Item(strGroupNames(j))
- dictGroupZiffern.Add(strGroupNames(j), grp.Value)
- Next
- 'Select Cases auf i und je nach Fall/Bundesland neuen String händisch mittels Dictionary zusammenbauen