2016-09-03 4 views
0

Я смотрел на другие вопросы вроде этого, но я не мог найти тот, который работал. Я пытаюсь проверить, ответил ли человек что-то , что означает «да», поэтому я проверяю несколько слов, которые означают «да». Но если они отвечают «yEs», мой код не будет работать, потому что его регистр чувствителен, и я не знаю, что делать.Как проверить, содержит ли строка слово без чувствительности к регистру?

Код:

String fq = JOptionPane.showInputDialog(null, "Welcome to RadinBot! Would you like to continue?", "RadinBot", JOptionPane.YES_NO_CANCEL_OPTION); 

if (fq.contains("yes") || 
    fq.contains("Yeah") || 
    fq.contains("Yup") || 
    fq.contains("mhm") || 
    fq.contains("Yea") || 
    fq.contains("sure")) 
+0

Вы считали преобразование введенного текста во все строчные буквы с помощью 'toLowerCase', а затем используя' contains' на входе в нижний регистр? Рассмотрим это: 'input.toLowerCase(). Содержит (« да »)'. Примечание: вам нужно будет преобразовать любые заглавные буквы в ожидаемом ответе и в нижнем регистре («Да» превращается в «да»). – Xetnus

+0

Да, у меня есть, и я не думаю, что это сработало для меня. но я мог бы попробовать еще раз, спасибо! –

+0

@ tunaki Я на самом деле не думаю, что это обман, потому что OP хочет сопоставить одно из нескольких слов, которое имеет другое решение. – Bohemian

ответ

4

Вы можете просто использовать toLowerCase() для удаления чувствительности к регистру:

if (fq.toLowerCase().contains("yes") || fq.toLowerCase().contains("yeah") || fq.toLowerCase().contains("yup") || fq.toLowerCase().contains("mhm") || fq.toLowerCase().contains("yea") || fq.toLowerCase().contains("sure")) 
+0

Большое вам спасибо! Самое смешное, я думал, что попробовал это, но теперь, когда я использовал это, он работал: D! –

+0

В любое время! Обязательно прочитайте другие ответы и попробуйте их, потому что есть несколько способов обмануть этого кота, и каждый из них будет лучше в разных обстоятельствах. –

1

Измените ваш fq.contains("yes") нравится это: fq.toLowerCase().contains("yes") так что в основном вы конвертируете любой пользователь вводит в нижний регистр и сопоставление с нижним регистром yes. Так что в основном вы делаете. нечувствительное к регистру.

Выполняйте то же самое для других условий.

1

Просто поместите этот текст в нижний регистр. И хранить слова в массиве для более чистого кода.

String words[] = ["yes", "yeah", "mhm", "yup"]; 
boolean accept = false; 
for (int i=0; i<words.length(); i++){ 
    if (text.toLowerCase().contains(words[i])){ 
     accept = true; 
     break; 
    } 
} 
if (accept){ 
    //do what you want to do. 
} 
+0

Я бы сделал это функцией, но это умный способ! –

0

Вы должны лучше использовать специализированную библиотеку: org.apache.commons.lang3.StringUtils.containsIgnoreCase("ABCDEFGHIJKLMNOP", "gHi");

Вы shount не вызов toUpperCase/toLowerCase, потому что странные локали чувствительные вещи могут произойти:

"ß".toUpperCase() // "SS" 
0

Для проверки нескольких слов в одном и сделать это регистр незаметно, используйте регулярное выражение!

if (fq.matches("(?i).*\\b(yes|Yeah|Yup|mhm|Yea|sure)\\b.*")) 

На самом деле, вам нужно регулярное выражение, потому что вы не хотите «Я яппи», даже если он содержит «Да». Вот где входит термин \b - это означает «граница слова». Если бы ваш код, используемый .equals() я бы предложил более просто:

if (fq.matches("(?i)yes|Yeah|Yup|mhm|Yea|sure")) 

Термин (?i) означает «регистронезависимы».

Выражение (a|b|c) является заменой ; | является логическим «ИЛИ» в регулярном выражении.

Вам необходимо .* либо конец, потому что matches() должен соответствовать целым Строка должна быть правдой.

Если вы используете .toLowerCase().contains(), вам нужно будет позвонить, что для каждого слова, которое вы ищете, и код будет крушением поезда.

Смежные вопросы