2010-12-16 13 views
3

Ich brauche einen regulären Ausdruck, der eine Kombination aus einer Zahl (größer als 5, aber kleiner als 500) und einer Textzeichenfolge nach der Zahl entspricht.Reguläre Ausdrücke für Zahlenbereich und Zeichen

Zum Beispiel können die folgenden Matches würden return true: 6 Artikel oder 450 Artikel oder 300 Artikel Rot (es kann auch andere Zeichen nach dem Wort "Item")

Während der folgenden Strings würde return false: 4 Artikel oder 501 Artikel oder 40 Red Artikel

ich habe versucht, die folgende Regex, aber es funktioniert nicht:

string s = "Stock: 45 Items";   
Regex reg = new Regex("5|[1-4][0-9][0-9].Items"); 
MessageBox.Show(reg.IsMatch(s).ToString()); 

Vielen Dank für Ihre Hilfe.

Antwort

5

sollten Diese Regex arbeiten zu überprüfen, ob Nummer im Bereich von 5 bis 500 ist:

"[6-9]|[1-9][0-9]|[1-4][0-9][0-9]|500" 

bearbeiten: Beispiel unten mit komplexeren regex, die zu Zahlen, die größer als 1000 ausschließt, und schließt andere Saiten als "Artikel" nach einer Nummer:

string s = "Stock: 4551 Items"; 
string s2 = "Stock: 451 Items"; 
string s3 = "Stock: 451 Red Items"; 
Regex reg = new Regex(@"[^0-9]([6-9]|[1-9][0-9]|[1-4][0-9][0-9]|500)[^0-9]Items"); 

Console.WriteLine(reg.IsMatch(s).ToString()); // false 
Console.WriteLine(reg.IsMatch(s2).ToString()); // true 
Console.WriteLine(reg.IsMatch(s3).ToString()); // false 
+1

Der zweite Abschnitt entspricht 01, also müssen Sie die erste Ziffer auf 0 zu verbieten ändern. – unholysampler

+0

@unholysampler: ja, du hast Recht, ich habe die Lösung bearbeitet, um korrekt zu sein –

+1

Vielen Dank für Ihre schnelle Antwort. Leider gibt Ihre Regex für Zahlen> 500 auch true zurück und wie füge ich der Regex die Zeichenfolge (Items) hinzu? – Rob

2

Die folgende Methode sollte tun, was Sie wollen. Es verwendet mehr als reguläre Ausdrücke. Aber seine Absicht ist klarer.

// itemType should be the string `Items` in your example 
public static bool matches(string input, string itemType) { 
    // Matches "Stock: " followed by a number, followed by a space and then text 
    Regex r = new Regex("^Stock: (\d+) (.*)&"); 
    Match m = r.Match(s); 
    if (m.Success) { 
     // parse the number from the first match 
     int number = int.Parse(m.Groups[1]); 
     // if it is outside of our range, false 
     if (number < 5 | number > 500) return false; 
     // the last criteria is that the item type is correct 
     return m.Groups[2] == itemType; 
    } else return false; 
} 
+0

Ich muss zustimmen diese Antwort scheint wie die logischste Situation. Nehmen Sie den Wert aus der Zeichenkette und führen Sie einen numerischen Vergleich durch. Ich sehe keinen klaren Regex, um dies zu tun, und Klarheit ist eine gute Sache beim Schreiben von Code! – onaclov2000

+0

@onaclov, froh, dass Sie zustimmen. Vielen Dank. – jjnguy

0
(([1-4][0-9][0-9])|(([1-9][0-9])|([6-9])))\sItems 
0

Was ist mit „\ < 500> | \ < [1-9] [0-9] [0-9]> | \ < [1-9] [0-9]> | \ < [6-9]> ", es funktioniert für mich gut in Linux-Shell, so dass es in C# ähnlich sein sollte. Sie haben einen Fehler hier im Web, es sollte Backslash> nach den Sets ... z. 500backslash>: