Java - 以相反的方式使用“.contains”

Java - using ".contains" in the opposite manner

我希望能够打印不包含单词 "Java"、"Code" 或 "String" 的字符串,但我不确定如何实现这一点,因为我认为这可以通过使用“!”来实现(不是)。然而,情况并非如此,因为尽管包含了我要禁止的字词,但字符串仍会打印出来。

任何关于如何实现这一目标的建议将不胜感激,在此先感谢。

System.out.println("Type in an input, plez?");
String userInput6 = inputScanner.nextLine();

if (!userInput6.toLowerCase().contains("Java") || !userInput6.toLowerCase().contains("Code") || !userInput6.toLowerCase().contains("String")) {
    System.out.println("I see your does not string contain 'Java', 'Code' or 'String, here is your string:- " + userInput6);
} else {
    System.out.println("Your string contains 'Java, 'Code' or 'String'.");
} 

I thought this would be achieved by using '!' (NOT)

是的。您只是没有正确地将它应用到您的情况:

你从这个声明开始:

userInput6.toLowerCase().contains("java") ||
userInput6.toLowerCase().contains("code") ||
userInput6.toLowerCase().contains("string")

检查输入是否包含 任何,而您希望否定此语句。

您可以将整个语句括在括号中 (()) 并否定 that:

!(userInput6.toLowerCase().contains("java") ||
userInput6.toLowerCase().contains("code") ||
userInput6.toLowerCase().contains("string"))

或将 DeMorgan's law 应用于析取的否定,它表明 a || b 的否定是 !a && !b.

因此,正如评论中 Carcigenicate 所述,您需要

!userInput6.toLowerCase().contains("java") &&
!userInput6.toLowerCase().contains("code") &&
!userInput6.toLowerCase().contains("string")

相反。

您的语句只是检查字符串是否不包含 至少一个 这些子字符串。这意味着只有当字符串包含这些字符串的 all 时,检查才会失败。对于 ||,如果任何操作数是 true,则整个语句是 true.

此外,mkobit 指出您要检查的字符串应该完全小写。否则,您正在检查 .toLowerCased 字符串是否包含大写字符 - always false.

一个更容易想到的方法可能是颠倒你的 if 语句:

if (userInput6.toLowerCase().contains("Java") ||
    userInput6.toLowerCase().contains("Code") ||
    userInput6.toLowerCase().contains("String")) {
    System.out.println("Your string contains 'Java, 'Code' or 'String'.");
} else {
    System.out.println("I see your does not string contain 'Java', 'Code' or 'String, here is your string:- " + userInput6);
} 
  • 由于您使用的是逻辑或,一旦您的 contains 检查为真,则整个条件为真。您希望所有检查都为真,因此您需要使用逻辑 AND (&&) 而不是

  • 正如@mk 指出的那样,您还有另一个问题。看:

    userInput6.toLowerCase().contains("Java")
    

    您将字符串小写,然后对照包含大写字母的字符串进行检查。你只是删除了所有大写字母,所以检查总是失败。

此外,您可以使用正则表达式:)

boolean notContains(String in) {
    return !Pattern.compile(".*((java)|(code)|(string)).*")
                   .matcher(in.toLowerCase())
                   .matches();
}

或者直接内联它:

System.out.println("Type in an input, plez?");
String userInput6 = inputScanner.nextLine();
if (!Pattern.compile(".*((java)|(code)|(string)).*")
            .matcher(userInput6.toLowerCase())
            .matches()) {
    System.out.println("I see your does not string contain 'Java', 'Code' or 'String, here is your string:- " + userInput6);
} else {
    System.out.println("Your string contains 'Java, 'Code' or 'String'.");
}