2017-04-07 72 views
-4

所以我有这样的方法:字符串匹配()方法不能正常工作

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是为用户自动生成的,他们必须输入准确的字符串进行验证。但是,即使输入了正确的字符串,它仍然表示它不正确。

enter image description here

有时工作,而且大多没有。我想知道我在这里做错了什么?

+2

你用'.equals()'试过了吗? –

+0

显示输入/输出会话的**文本**,而不是**图片**。这样,人们可以在测试时使用复制和粘贴等(尽管在这种情况下,很明显是什么问题)。 –

回答

3

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

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

1

匹配需要一个正则表达式作为参数。在屏幕截图中,您输入了oH-?bt-4#,其中包含?。这个角色在正则表达式中有特殊的含义。如果您想使用String#match方法,则必须转义所有特殊字符,例如, G。使用Pattern.quote

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

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

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

当你没有一个理由选择正则表达式方法matches,你应该坚持等于,因为它更高效。

+0

这个工程!非常感谢你。 – zairuh

1

根据的Javadoc,

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

告知此字符串是否不是给定regular expression匹配。现在

"Java".matches("Java")是真实的,因为正则表达式Java匹配为Java

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

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

它也很可能是一个随机字符串会导致一些不能被编译成一个正则表达式,在这种情况下,你的代码会抛出一个PatternSyntaxException - 例如a[bc将做到这一点,因为不匹配的支具。

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