J'essaie de terminer la dernière partie de ce code, mais je n'arrive pas à obtenir les 2 dernières instructions if pour être valides quand elles le devraient. Le second devrait s'afficher lorsqu'il n'y a pas de lettres, de chiffres ou de tirets (-). Le troisième doit s'assurer que les 2 tirets ne sont pas consécutifs et non au début ou à la fin. Les expressions doivent être fausses, mais je n'ai aucune idée de la façon de les corriger, encore nouvelles dans regex. Merci d'avance pour votre aide! Voici ce que j'ai jusqu'à présent ...
import java.util.Scanner;
public class VerifySerialBHarris {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String text;
String cha;
System.out.println("Enter a Serial number: ");
text=input.nextLine();
if(text.matches("[A-Za-z0-9]+(-[A-Za-z0-9]+){2}")){
System.out.println("Serial number "+text+" verification \nValid");
System.out.println("Enter a wildchar character: ");
cha=input.nextLine();
text= text.replaceAll("[A-Za-z0-9]", cha);
System.out.println("Masked serial: "+text);
}
if(text.matches(".[^-A-Za-z0-9].")) {
System.out.println("Invalid. Serial should only contain letters, numbers, and dashes(-)");
}
if(text.matches("[^A-Za-z0-9]+(-[A-Za-z0-9]+)"))
System.out.println("Invalid. There should be exactly 2 non-consecutive dashes in the middle. ");
}
}
3 Réponses :
Faites correspondre la série exactement
^[A-Za-z0-9]{4}\x2d[A-Za-z0-9]{4}\x2d[A-Za-z0-9]{4}
Utilisez Regexr.com pour créer et test
Vous avez déjà le modèle complet [A-Za-z0-9] + (- [A-Za-z0-9] +) {2} et il pourrait être plus facile de lister les modèle et de donner un message d'erreur indiquant que les données saisies ne respectent pas le modèle requis.
Si vous souhaitez donner des commentaires à l'utilisateur en analysant le type d'erreur qui a été commise, vous devez créer un modèle pour tous les types d'erreurs qu'un utilisateur peut faire. Pour le code, je suggère d'utiliser par exemple une structure if else if afin que vous n'obteniez pas le message d'erreur tant que le modèle est correct.
À propos des deuxième et troisième modèles
Le second devrait s'afficher lorsqu'il n'y a pas de lettres, de chiffres ou de tirets (-).
Le deuxième motif . [^ - A-Za-z0-9]. correspondra à 3 caractères où le premier et le dernier peuvent être n'importe quel caractère sauf une nouvelle ligne due au point et peuvent également correspond à une lettre ou à un chiffre.
Pour ne pas faire correspondre les lettres, les chiffres ou les tirets, vous pouvez utiliser:
.*[^-A-Za-z0-9ITED.*
Le troisième doit s'assurer que les 2 tirets ne sont pas consécutifs et non au début ou à la fin
Le troisième motif [^ A-Za-z0-9] + (- [A-Za-z0-9] +) correspond d'abord à ce qui n'est pas dans la classe de caractères en raison de la négation l'utilisation de [^ peut également correspondre à un hypen car il n'est pas répertorié mais n'est pas obligatoire.
Pour correspondre à ce modèle, vous pouvez répéter le trait d'union plus d'une fois:
[A-Za-z0-9ITED+(-+[A-Za-z0-9ITED+){2,}
Votre première expression régulière, [A-Za-z0-9] + (- [A-Za-z0-9] +) {2} , ne correspond déjà qu'aux codes contenant trois blocs alphanumériques avec exactement deux tirets interstitiels non consécutifs.
Là où vous utilisez la deuxième regex, c'est surtout problématique parce que votre condition est inversée. Il est plus facile de se demander s'il ne correspond pas à [-A-Za-z0-9] + que s'il correspond à un autre modèle qui ne correspond qu'aux séquences avec des caractères invalides - un double négatif déroutant. < / p>
Pour la troisième condition, vous n'avez probablement pas besoin de vérifier quoi que ce soit. Vous avez déjà éliminé tous les autres cas d'échec (caractères non valides et mise en page incorrecte) afin que vous puissiez simplement décrire que vous avez besoin de 3 blocs alphanumériques séparés par un seul tiret.
Et comme cela a été mentionné ailleurs, vous devriez utiliser if ... else if ... else ... etc.
voir stackoverflow.com/questions/ 4068629 /…
@ScaryWombat Ce n'est pas le problème. Les tirets n'ont pas de signification particulière au début ou à la fin des classes de caractères comme ça.