Übereinstimmungen von nur einem Vorkommen eines Zeichens aus einer gegebenen Menge

8

Ich muss eine Eingabezeichenfolge so validieren, dass die Validierung true nur zurückgibt, wenn die Zeichenfolge eines der Sonderzeichen @ # $%, nur eines und höchstens einmal enthält. Buchstaben und Zahlen können überall sein und können beliebig oft wiederholt werden, aber mindestens eine Zahl oder ein Buchstabe sollte vorhanden sein

Zum Beispiel:

a @: true

@a: wahr

a @ $: falsch

a @ n01: Wahr

an01: falsch

a: falsch

@: falsch

Ich habe es versucht

%Vor%

Ich hatte gehofft, dass dies einem Vorkommen von Sonderzeichen entsprechen würde. Aber nein. Ich brauche nur ein Vorkommen von irgendeinem in der Menge.

Ich habe auch den Wechsel versucht, konnte ihn aber nicht lösen.

    
Vivek Vardhan 29.05.2014, 09:26
quelle

2 Antworten

9

Vivek, deine Regex war wirklich nah dran. Hier ist der One-Line-Regex, den Sie suchen.

%Vor%

Siehe Demo

Wie funktioniert es?

  1. Die Anker ^ und $ stellen sicher, dass alles, was wir zusammenbringen, die gesamte Zeichenfolge ist, und vermeiden Sie später teilweise Übereinstimmungen mit verbotenen Zeichen.
  2. Der (?=.*?[0-9a-zA-Z]) lookahead stellt sicher, dass wir mindestens eine Zahl oder einen Buchstaben haben.
  3. [0-9a-zA-Z]*[@#$%][0-9a-zA-Z]* entspricht null oder mehr Buchstaben oder Ziffern, gefolgt von genau ein Zeichen, das entweder ein @ , # , $ oder % ist, gefolgt von Null oder mehr Buchstaben oder Ziffern - damit wir ein Sonderzeichen haben, aber nicht mehr.

Implementierung

Ich bin mir sicher, dass Sie wissen, wie Sie dies in Java implementieren, aber um zu testen, ob die Zeichenfolge übereinstimmt, könnten Sie etwas wie folgt verwenden:

%Vor%

Was war falsch an meiner Regex?

Eigentlich war deine Regex fast da. Hier fehlt was.

  1. Da Sie nicht die Anker ^ und $ hatten, konnte die Regex eine Teilmenge der Zeichenkette anpassen, zum Beispiel a# in a##%% , was bedeutet, dass Sonderzeichen in der String, aber außerhalb des Spiels. Nicht was du willst: wir müssen die ganze Zeichenfolge validieren, indem du sie verankerst.
  2. Sie benötigten etwas, um sicherzustellen, dass mindestens ein Buchstabe oder eine Ziffer vorhanden war. Sie könnten es definitiv mit einem Wechsel getan haben, aber in diesem Fall ist ein Lookahead kompakter.

Alternative mit Alternation

Da Sie für den Datensatz Alternativen versucht haben, ist hier eine Möglichkeit:

%Vor%

Siehe Demo .

Lass es mich wissen, wenn du Fragen hast.

    
zx81 29.05.2014, 09:34
quelle
1

Ich hoffe, dass diese Antwort für Sie nützlich sein wird, wenn nicht, könnte es für zukünftige Leser sein. Ich werde hier vorab zwei Annahmen machen: 1) Sie brauchen Regex per se nicht, Sie programmieren in Java. 2) Sie haben Zugriff auf Java 8.

Dies könnte folgendermaßen geschehen:

%Vor%

Hier bin ich:

  1. Verwenden Sie als Eingabe eine String und eine List<Character> der erlaubten.
  2. Erhalte ein IntStream (bestehend aus Zeichen) aus dem String .
  3. Filtert alle char , um nur im Stream zu bleiben, wenn sie sich in List<Character> befinden.
  4. Gibt true nur dann zurück, wenn count() == 1 , dh die Zeichen in List<Character> , genau eins vorhanden ist.

Der Code kann wie folgt verwendet werden:

%Vor%

Ergebnis in false , true , false , false .

    
skiwi 29.05.2014 09:43
quelle

Tags und Links