Поиск слова по шаблону из строки в java?(Алгоритм)
Не въезжаю в алгоритм. Есть строка:
String My_String = "Привет, как дела? Что с погодой а-за-за-за?";
Нужен алгоритм поиска (метод java), который бы искал в данной строке слова по
шаблону "абв", таким образом он пихал бы в массив MyArray два слова, внимание,
MyArray[0]= "как";
MyArray[1]= "что";
То есть, я думаю так:
- Метод должен выглядеть так
MySearch(String MyPattern, char[] MyABC){... }. ГдеMyPattern'омможет быть формула например"абв".Гдеchar MyABC[]- алфавит (набор символов из которых состоит проверяемаяMyString) - Если я правильно понял, то все должно сводится к проверке типа "абвбвв"
Например, это будет слово "Вереск", т.е. если буква повторяется, то она
будет такой же, как и по счету в алфавите. - Если я правильно понимаю? то должен быть цикл в цикле, как минимум, но как это работает пока не доходит. Мои попытки не увенчались успехом.
- Нужен именно ручной метод, а не встроенный, чтобы его можно было подкорректировать,
Ребят, помогите мне с ручным алгоритмом на java? Только не минусуйте меня, просто скажите в комментах, что не то, я подредактирую.)
Ответы (1 шт):
Я думаю, вы дошли до того этапа, когда придется учить регулярные выражения :)
Вот несколько полезных ссылок:
- Прекрасная шпаргалка, если вдруг что-то забылось
- Регулярные выражения в Java
- Сайт для тестирования регулярных выражний
Теперь можно и писать код:
public static void main(String[] args) {
final String someText = "Привет как дела, что с погодой за-за-за?";
Pattern regexp = Pattern.compile("\\b[а-я]{3}\\b");
Matcher match = regexp.matcher(someText);
while(match.find()) {
System.out.println(match.group());
}
}
Вывод:
как
что
Пожалуй, распишу немного подробнее:
- Создаем объект класса
Pattern- это и есть наше регулярное выражение - Объект
Matcher- это все совпадения по данному выражению while(match.find())перебирает все результаты и выводит на консоль
И разберем регулярку:
\b[а-я]{3}\b
\b- это обозначение границы слова[а-я]- все строчные русские буквы{3}- требуемое количество количество букв
В итоге получаем: подойдут любые слова из строчных русских букв, длиной ровно 3 символа
Нужно чтобы искались слова с Только с первой буквой -Любой- а вторая и третья Любая но не первая, а вторая, иными словами "ABB", например как в слове "Kaa" или "Маа"
Вот такая получилась регулярка:
\b(\p{L})((?!\1)\p{L})\2\b
Разберем подробнее:
\p{L}- любой UTF-8 символ(?!\1)\p{L}это отрицательный просмотр назад. Он проверяет, что захват по маске\p{L}не равен захвату предыдущей группы (скобки вокруг первого\p{L}нужны для того, чтобы создать из него группу). Проще говоря, он проверяет, что второй символ не равен первому.((?!\1)\p{L})\2соответствует символу, который попал во вторую группу. То есть 2 и 3 символы повторяются.
Вот и получается: строка из 3 символов; первый любой, второй любой, но не равен первому, третий равен второму