Ich würde gerne die Eingabe von ISBN-Nummern in ein Textfeld mit einem regulären Ausdruck validieren. Das Problem ist nur, dass die Gesamtlänge zwar fixiert ist, einige Abschnitte der Zeichenfolge aber unterschiedlich lang sein dürfen? Kennt jemand eine Lösung?
Je nach zu berücksichtigenden ISBN Nummerdefinitionen kann es etwas variieren, aber nun denn.. Ungetestet, aber ungefähr so:
using System; using System.Text.RegularExpressions;
public class Test {
public static void Main () {
// Define a regular expression for ISBN Regex rx = new Regex(@"ISBN\x20(?=.{13}$)\d{1,5}([- ])\d{1,7\1\d{1,6}1(\d|X)$");
// Define test ISBN numbers string tests[] = {"ISBN 2-16678-888-1", "ISBN 1 84736 123 4"};
// Check each test string against the regular expression. foreach (string test in tests) { if (rx.IsMatch(test)) { Console.WriteLine("{0} is a valid ISBN.", test); } else { Console.WriteLine("{0} is not a valid ISBN.", test); } }
Zur Erläuterung vielleicht noch kurz: 'ISBN\x20(?=.{13}$)' : Folgen auf den String ISDN und dem folgenden Leerzeichen 13 Zeichen, dann mach weiter... \d Entspricht einer beliebigen Dezimalziffer. {n,m}: mindestens n, jedoch höchstens m Übereinstimmungen '([- ])': Minus oder Leerzeichen '\1': Rückverweis '(\d|X)': Dezimalziffer oder X
Ergänzung: Der WertISBN kommt nicht in dem Barcode vor. Des weiteren ist die letzte Stelle eine Prüfziffer deren Berechnung du durchführen solltest. Näheres findest du auch hier: http://de.wikipedia.org/wiki/ISBN
Also mir fällt keine Lösung mit RegEx ein. Aber du kannst erst alle Minuszeichen und andere Trenner löschen und dann mit RegEx oder einer simplen Überprüfung der Länge weiter machen.