2017-09-24 3 views
-1

Da es kein Tutorial gibt, wie es zu tun ist und jede Frage ihre eigene einzigartige Lösung hat, kann ich nicht verstehen, wie dies möglich wäre, um es zum Laufen zu bringen. Was ich versuche zu tun ist, Zeilen zu löschen, die die Anforderungen nicht erfüllt haben. Jede Zeile hat ein Wort. Verwenden einer RichTextBox.Erweiterte Regex-Befehle

Meine Anforderungen sind für jede Leitung:

  • min 3 Zahlen
  • max 25 Buchstaben
  • atleast 1 Nummer
  • atleast 1 Brief

wenn eine dieser Anforderungen sind in einer einzelnen Zeile nicht gültig, wird diese Zeile gelöscht. Der Code, mit dem ich spielen (ohne Erfolg) war:

richTextBox1.Text = Regex.Replace(richTextBox1.Text, "(a-z).*?(0-9)", ""); 
+2

"min 3 numbers" und "atleast 1 number" - also welche genauen minimalen Zahlen zählen? Einer von drei? –

+1

"Da gibt es kein Tutorial, wie es geht und jede Frage hat ihre eigene einzigartige Lösung" Whaaat? Sie meinen, es gibt keine [online Ressource] (https://regexone.com/) für Regex? Es gibt kein Tutorial, das Ihnen die genaue Lösung gibt, nicht einmal in der Nähe. Es gibt eine Tonne von pwd Regex-Validierung überall! Es gibt sogar ein Werkzeug, um das für Sie zu schreiben. –

+1

Mögliches Duplikat von [Regex für Passwort muss mindestens acht Zeichen, mindestens eine Zahl sowie Groß- und Kleinbuchstaben und Sonderzeichen enthalten] (https://stackoverflow.com/questions/19605150/regex-for-password-must -be enthält-mindestens-acht-Zeichen-mindestens-eine-Zahl) –

Antwort

-1

Ich glaube, Sie nicht einen regulären Ausdruck für diese Aufgabe benötigen. Genau prüfen jede Zeile Ihrer RichTextBox mit einfachen Linq-Abfrage wie folgt aus:

// rtb is a RichTextBox; 
var sb = new StringBuilder(); 
foreach (var line in rtb.Lines) 
{ 
    var numbers = line.Count(char.IsDigit); 
    var letters = line.Count(char.IsLetter); 

    if (numbers < 1 || numbers > 3 || letters < 1 || letters > 25) 
     continue; 

    sb.AppendLine(line); 
} 
rtb.Text = sb.ToString(); 
-1

Sie können quantifiers verwenden [a-z] {} 3,25, zum Beispiel.

https://docs.microsoft.com/en-us/dotnet/standard/base-types/quantifiers-in-regular-expressions

Ich weiß jetzt, dass 3 bis Zahlen bezieht sich aber Sie bekommen die Idee.

+0

Wie um alles in der Welt bekommt das eine Down-Vote? –

+0

wahrscheinlich, weil er jetzt falsch geschrieben hat, Grammatik-Nazi-Moderatoren: D – Wuzbee

+0

:-) Ich habe es jetzt geändert - es schien nicht wert, aber wenn es wahrscheinlich die Leute verärgern wird .... –

0

Wie oben erwähnt, sind "min 3 Nummern" und "mindestens 1 Nummer" widersprüchliche Anforderungen. Ich nehme an, du meinst Max 3 Nummern. Wenn ja (aber Sie können sich an andere Anforderungen anpassen), bauen wir Ihre Regex Schritt für Schritt.

  1. Briefe: Sie können wie [a-zA-z] oder besser [\p{L}] mit etwas, das man überein, wenn Sie nicht-triviale Buchstaben berücksichtigen wollen, zum Beispiel Akzentbuchstaben
  2. Zahlen: eins mit [\d]
  3. Wiederholte Instanzen: wenn Sie zwischen m und n Instanzen eines Zeichens, z. eine Zahl, schreibt [\d]{m, n}
  4. Linien: eine Linie zwischen einem ^ und $ Paar besteht und es kann Zeichensetzung, Leerzeichen usw.
  5. Counting Instanzen ist: wenn Sie nur Instanzen zählen wollen, verwenden Lookaheads; Wenn Sie sicherstellen möchten, bekommen Sie ein Spiel (zB zwischen 1 und 3 Zahlen in einer Linie, die ^[\d]{1,3}$ in regex ausgedrückt bedeutet), muss er innerhalb (?= und )
  6. Null o mehr Zeichen: Verwenden Sie *, zB „Null oder mehr Zahlen "wird [\d]*
  7. Anders als ein bestimmtes Zeichen: wenn Sie nach einem anderen Zeichen suchen, z sowohl von den verschiedenen anderen Charaktere haben, können Sie suchen, möglicherweise bedeutet, dass Sie auch vor: aus einer Reihe, ein Caret (^), bevor sie verwendet werden, wie in [^\d]
  8. Jedes Zeichen: Wählen Sie mit .
  9. „Mindestens“ und danach.Wenn Sie nach einer Nummer suchen, der möglicherweise eine oder mehrere Nicht-Nummern vorangestellt sind, schreiben Sie [^\d]*[\d]; falls sie eine Nummer suchen, die möglicherweise oder möglicherweise nicht durch einen oder mehrere nicht-Zahlen vorangehen und/oder folgen, schreiben [^\d]*[\d][^\d]*

So Ihre Anfrage jede Zeile passen, die

  • enthält zwischen 1 und 3 Zahlen (egal was vorangeht oder folgt jeder von ihnen): (?=(^([^\d]*[\d][^\d]*){1,3}$))
  • zwischen 1 und 25 Buchstaben (egal was jeder von ihnen vorausgeht oder folgt): (?=(^([^\p{L}]*[\p{L}][^\p{L}]*){1,25}$))

Da Sie gerade die Anzahl und die Buchstabenanzahl mit den beiden Regex oben überprüft haben, aber tatsächlich nichts ausgewählt haben, müssen Sie tatsächlich noch alles abgleichen. Um eine Zeile beliebiger Länge anzupassen, schreiben Sie \b.*\b.

alles Putting zusammen, erhalten Sie

(?=(^([^\d]*[\d][^\d]*){1,3}$))(?=(^([^\p{L}]*[\p{L}][^\p{L}]*){1,25}$))^.*$ 

Nützliche Links: this und this one. Test here.