无法使正则表达式正确工作

时间:2019-02-07 01:22:32

标签: java regex

我正在尝试完成这段代码的最后一部分,但似乎无法获得最后两个if语句在应有的时候有效。 如果没有字母数字或破折号(-),则应显示第二个数字。 第三个应该确保两个破折号是不连续的并且不在开始或结尾。 表达式必须是错误的,但我对如何更正则表达式尚不了解。 谢谢您的帮助!这就是我到目前为止所拥有的...

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. ");
}
}

Example

3 个答案:

答案 0 :(得分:0)

完全匹配序列

^[A-Za-z0-9]{4}\x2d[A-Za-z0-9]{4}\x2d[A-Za-z0-9]{4}

使用Regexr.com进行构建和测试

答案 1 :(得分:0)

您已经拥有完整的模式[A-Za-z0-9]+(-[A-Za-z0-9]+){2},列出该模式并给出一条错误消息,指出输入的数据不符合所需的模式可能更容易。

如果您想通过分析所犯的错误种类来向用户提供反馈,则必须为用户可能犯的所有种类的错误创建一个模式。对于代码,我建议例如使用if else if结构,以便在模式正确时不会出现错误消息。

关于第二和第三种模式

当没有字母数字或破折号(-)时应显示第二个。

第二个模式.[^-A-Za-z0-9].将匹配3个字符,其中第一个和最后一个可以是除点号之外的换行符(由于点的原因),还可以匹配字母或数字。

要不匹配字母数字或破折号,您可以使用:

.*[^-A-Za-z0-9].*

第三个应确保两个破折号不连续且不在开头或结尾

由于使用[^A-Za-z0-9]+(-[A-Za-z0-9]+)取反,第三个模式[^首先与字符类中的字符匹配,也可以与连字符匹配,因为它没有列出,但不必。

要匹配该模式,您可以将连字符重复1次以上:

[A-Za-z0-9]+(-+[A-Za-z0-9]+){2,}

Updated Java code

答案 2 :(得分:0)

您的第一个正则表达式[A-Za-z0-9]+(-[A-Za-z0-9]+){2}已经与仅包含三个字母数字块的代码完全匹配,该三个字母数字块具有恰好两个非连续的填隙破折号。

在使用第二个正则表达式的地方,这主要是有问题的,因为您的条件已经倒置。问是否匹配[-A-Za-z0-9]+失败要比不匹配某些仅适合无效字符序列的其他模式(一个令人困惑的双重否定)要容易得多。

对于第三个条件,您可能根本不需要检查任何内容。您已经消除了所有其他失败情况(无效字符和不正确的布局),因此只需描述您需要3个字母数字块并用一个破折号分隔即可。

正如在其他地方提到的,您应该使用if ... else if ... else ...等。