#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, и означает, что должна присутствовать хотя бы одна часть.