【问题标题】:String matches() method not working properly字符串匹配()方法无法正常工作
【发布时间】:2017-04-07 15:20:41
【问题描述】:

所以我有这个方法:

   void verifySecretKey(String userEnters, Scanner input){

    while(true) {
        System.out.print("Enter the secret key:  ");
        userEnters = input.nextLine();
        System.out.println("\nVerifying Secret Key...");

        if (secretKey.matches(userEnters)) {
        System.out.println("Secret key verified!");
        break; } 

        else {
        System.out.println("The secret key does not follow the proper format!"); }
    }
}

由于某种原因,它无法正常工作。系统会自动为用户生成字符串 secretKey,他们必须输入要验证的确切字符串。但是,即使输入了正确的字符串,它仍然会说它不正确。

有时它会起作用,但大多数情况下它不会。我想知道我在这里做错了什么?

【问题讨论】:

  • 你试过.equals()吗?
  • 显示输入/输出会话的文本,而不是它的图片。这样,人们可以在测试等时使用复制和粘贴(尽管在这种情况下,很明显哪里出了问题)。

标签: java regex string


【解决方案1】:

String#matches 接受定义正则表达式的字符串。如果要检查是否相等,请使用equals,而不是matches

"oH-?bt-4#" 包含一个?,它是正则表达式中的一个特殊字符,而不是文字?。所以字符串与正则表达式不匹配。

【讨论】:

    【解决方案2】:

    Matches 将正则表达式作为参数。在屏幕截图中,您输入了oH-?bt-4#,其中包含?。此字符在正则表达式中具有特殊含义。如果要使用String#match 方法,则必须转义所有特殊字符,例如。 G。使用Pattern.quote:

    if (secretKey.matches(Pattern.quote(userEnters))) //...
    

    由于您的目标似乎是检查两个字符串是否相同,您可以只使用String#equals 方法:

    if (secretKey.equals(userEnters)) //...
    

    当您没有理由选择正则表达式方法 matches 时,您应该坚持使用 equals,因为它更有效。

    【讨论】:

      【解决方案3】:

      根据 Javadoc,

      公共布尔匹配(字符串正则表达式)

      判断这个字符串是否匹配给定的regular expression

      现在,"Java".matches("Java") 为真,因为正则表达式 JavaJava 匹配。

      但是,有很多正则表达式自身不匹配,如果随机生成字符串,您很可能会找到一个。

      例如 "a+bc".matches("a+bc") 返回 false -- 因为那里没有任何内容与文字字符 + 匹配(a+ 匹配一个或多个 as)。

      随机字符串也很可能会导致无法编译为正则表达式的内容,在这种情况下,您的代码将抛出 PatternSyntaxException - 例如 a[bc 会因为不匹配而执行此操作大括号。

      要测试两个字符串是否完全相同,请使用.equals()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多