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, deine Regex war wirklich nah dran. Hier ist der One-Line-Regex, den Sie suchen.
%Vor%Siehe Demo
Wie funktioniert es?
^
und $
stellen sicher, dass alles, was wir zusammenbringen, die gesamte Zeichenfolge ist, und vermeiden Sie später teilweise Übereinstimmungen mit verbotenen Zeichen. (?=.*?[0-9a-zA-Z])
lookahead stellt sicher, dass wir mindestens eine Zahl oder einen Buchstaben haben. [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.
^
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. 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.
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:
String
und eine List<Character>
der erlaubten. IntStream
(bestehend aus Zeichen) aus dem String
. char
, um nur im Stream zu bleiben, wenn sie sich in List<Character>
befinden. 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
.