| 

.NET C# Java Javascript Exception

1
Es sollen Nummern aus Zeichenketten inkrementiert werden, was zunächst nicht dramatisch ist, mit Regex geht das ziemlich gut. Im folgenden Beispiel soll die Gruppe "number" inkrementiert werden
string pattern = @"(?<text>[A-Z]{2}[0-9]{3,4}\.)(?<number>[0-9]{2}[A-Z]{0,1})";           

foreach (var number in numbers)
{
Console.WriteLine("{0} => {1}", number,
Regex.Replace(number, pattern, IncrementNumber));
}


Zusätzlich sollen nun aber noch Wertebereiche abgedeckt werden:

  • für [0-9]{2} nur die Zahlen von 01..50, denkbar wäre (0[1-9]|[1-4][0-9]|50)
  • für [A-Z]{0,1} nur die Buchstaben A..B, denkbar wäre ([A-B]{0,1})

Gezählt werden soll z.B. so {AB123.01A, AB123.01B, AB123.02A, ...}

Die Maske kann am einfachsten so definiert werden TTTTTTNN{01..50}A{'A'..'B'}
mit TTTTTT unveränderlicher Text, NN eine Zahl im Bereich {01..50} mit führenden Nullen, A ein Buchstabe im Bereich {'A'..'B'}

Gibt eine effiziente Lösung dafür, auch Alternativen ohne Regex (vielleicht MaskedTextProvider o.ä.) die man verwenden könnte?
20.01.2011
me 1,1k 2 9
1 Antwort
1
Hallo,

mein Vorschlag wäre folgender:

Beginnen wir mal mit dem einfachen Teil:

Was dir ja schon bekannt ist, ist wenn du den Buchstaben 'A' hast willst du den nächst höheren Buchstaben haben.
In der folgenden Methode wird davon ausgegangen, dass du maximal 'B' zurückbekommst.
Sollte aber bereits B als Parameter in die Methode übergeben werden, wird der Wert wieder auf A zurückgesetzt und true zurückgegeben. Das selbe kann auf Zahlen angewendet werden.

/// <summary>
/// Get next character between minimum and maximum
/// </summary>
/// <param name="c">The current character that is increased</param>
/// <param name="minimum">The minimum value of character c</param>
/// <param name="maximum">The maximum value of character c</param>
/// <returns>If there was a overflow when calculating minimum</returns>
private static bool GetNextChar(ref char c, char minimum, char maximum) {
if (c < maximum) {
c = (char)((int)c + 1);
return false;
} else {
c = minimum;
return true;
}
}


Wie beim normalen Addieren gehst du von rechts nach links vor.
Du nimmst dir also jedes Zeichen des strings vor.
Das letzte Zeichen wird immer erhöht, alle weiteren nur dann, wenn ein "Overflow" beim zuletzt bearbeiteten Zeichen aufgetreten ist.
Die neuen Buchstaben werden in einer Liste zwischengespeichert.
Wenn alle Zeichen behandelt wurden, dann wird unsere Liste noch invertiert und als string zurückgegeben.

public static string IncrementNumber(string number) {
List<char> chars = new List<char>();
bool increaseNextNumber = true;
for (int i = number.Length - 1; i >= 0; i--) {
char c = number;
if (increaseNextNumber) {
if (char.IsLetter(c)) {
increaseNextNumber = GetNextChar(ref c, 'A', 'B');
}
if (char.IsDigit(c)) {
increaseNextNumber = GetNextChar(ref c, '0', '9');
}
//Ignore any other character (.,-)
}
chars.Add(c);
}

if (increaseNextNumber)
throw new ArgumentOutOfRangeException();

chars.Reverse();
return new String(chars.ToArray());
}



static void Main(string[] args) {
string number = "AB123.01A";
for (int i = 0; i < 1000; i++) {
Console.WriteLine(number);
number = IncrementNumber(number);
}
Console.Read();
}
15.02.2011
woni 170 1 4
woni 170 1 4
Irgendwie gibt es noch Probleme mit dem Code-Tag, der schließt sich nicht richtig.
Aber ich hoffe ich konnte dein Problem richtig deuten.
woni 15.02.2011
Das Problem ist ein anderes, du hast die Wertebereiche vergessen. Das wesentliche ist die Verwendung des jeweiligen Patterns. Dadurch wird das Inkrementieren eingeschränkt.
me 09.03.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH