Метод проверяет, соответствует ли строка шаблону, который не работает

#java #regex

Вопрос:

У меня есть метод checkIfStringIsValidWord(строка), который проверяет, является ли строка «допустимым словом» на моем выдуманном языке. «Допустимое слово» — это слово, состоящее только из подстроки «ba» и/или «fi» и/или » ifi » (bafi, bafifiba, ifibaifibaifififi-все допустимые слова). Пустые/пустые строки не могут быть переданы в качестве параметров.

Метод работает для многих слов, но возвращает значение false для допустимого слова: «бабафибафифиба». Что не так с регулярным выражением, которое у меня есть? Помощь приветствуется.

 public boolean checkIfStringIsValidWord(String word) {  return word.matches("(ifi)*(ba)*(fi)*(ifi)*(ba)*(fi)*"); }   

Комментарии:

1. это по-прежнему возвращает значение false для данного слова, но вы помогли мне найти ответ matches("(ifi|fi|ba)*") , который работает со всеми моими тестовыми случаями (все еще может быть неправильным).

2. В вашем примере есть 3 отдельных бакалавра, в регулярном выражении всего 2 отдельных бакалавра. Кроме того, ваше регулярное выражение имеет тенденцию быть медленным.

3. Извините, это ^(?:i?fi|ba)*$ , конечно, так. Я сделал неправильный i выбор.

Ответ №1:

Правильная функция:

 public boolean wordValid(String word) {  return word != null amp;amp; word.matches("(ifi|ba|fi) "); }  

Это регулярное выражение говорит, что ваше слово состоит из таких частей, как ifi, ba, fi, и означает, что должна присутствовать хотя бы одна часть.