Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

Регулярное выражение для определения гласной или согласной буквы в начале строки

#java #регулярные_выражения


Как составить такое регулярное выражение которое проверяет только первую букву в
строке на то является она согласной или гласной?

Тут нужно как-то регулярное выражение написать

if (string.matches("[рег-ое выражение]")) {
        return true;
    }

    


Ответы

Ответ 1



Должно быть достаточно такого: str.matches("^(?i:[aeiouy]).*"). Для кириллицы - str.matches("^(?ui:[аеёиоуыэюя]).*"). ^ обозначает начало строки (?i:...) - включает CASE_INSENSITIVE для этой группы, чтобы не перечислять повторно заглавные буквы. (?ui:...) Важно! Если вы работаете с юникодом, то вышеуказанный ключ не сработает. Нужно добавить UNICODE_CASE, т.е. ?ui. [aeiouy] - все гласные. Если нужно найти все согласные, то нельзя использовать [^aeiouy], т.к. в эту группу попадают вообще все символы юникода, кроме этих шести. Нужно точно так же перечислить согласные. .* - дальше сколько угодно (хоть ноль) любых символов, кроме конца строки. Демонстрация работы с разными строками: public class Main { public static void main(String[] args) { String[] strs = {"abcd efjk", "hello world", "a", "E", "d", "", "\n", "юникод"}; for (String str: strs) { boolean test = str.matches("^(?i:[aeiouy]).*"); System.out.println(str + ": " + test); } } } Результат: abcd efjk: true hello world: false a: true E: true d: false : false : false юникод: false

Ответ 2



Чтобы определить, является ли первая буква в строке гласной или согласной, можно обойтись без регулярного выражения. Достаточно определить строку со всеми гласными или согласными, а потом проверить наличие в этой строке первого символа тестируемой строки: // Начинается ли строка с гласной? String vowelsRussian = "аоуэиыеёяю"; // "aeiouy" (англ.) String testRussian = "Ёрш сегодня не клюёт"; if (vowelsRussian.indexOf(Character.toLowerCase(testRussian.charAt(0))) != -1) { System.out.println(testRussian + " начинается с гласной"); } // Для проверки на согласную букву в начале используйте // String consonantsRussian = "йцкнгшщзхфвпрлджбтмсч"; // String consonantsEnglish = "qwrtplkjhgfdszxcvbnm"; // "y" можно рассматривать и как гласную, и как согласную букву Регулярное выражение имеет смысл использовать в более сложных сценариях. Тогда можно использовать следующее решение: // Тоже самое с использованием регулярного выражения Matcher m = Pattern.compile("^[АОУЭИЫЕЁЯЮаоуэиыеёяю]").matcher(testRussian); if (m.find()) { System.out.println(testRussian + " начинается с гласной"); } // С согласными можно так же, как и с гласными, или можно воспользоваться // вычитанием символьных классов: String testRussian2 = "Сегодня ёрш клюёт"; Matcher m2 = Pattern.compile("^[б-щБ-Щ&&[^ОУИЕоуие]]").matcher(testRussian2); if (m2.find()) { System.out.println(testRussian2 + " начинается с согласной"); } См. Java-демо онлайн. Внимание: find() работает оптимальнее matches(), так как не требует полного совпадения (не возникнет проблем со строками, содержащими символы переноса строки при меньшей нагрузке на процессор). Подробнее о вычитании символьных классов в Java смотрите Регулярные выражения в Java. Часть 2. В регулярке [б-щБ-Щ&&[^ОУИЕоуие]] нет а, э, ю, я, ё, так как эти гласные просто не входят в диапазон б-щБ-Щ. Не стоит использовать флаг UNICODE_CASE без необходимости (так как "Specifying this flag may impose a performance penalty" (= "При использовании данного флага могут возникнуть проблемы с производительностью"), лучше просто перечислить необходимые нам в данном случае диапазоны символов.

Ответ 3



Я нашел ответ, вроде бы. String string = "touch"; if (string.matches("^[^aeiouyAEIOUY]\\w++")) { System.out.println("гуд"); } else if (string.matches("^[aeiouyAEIOUY]\\w++")) { System.out.println("бэд"); }

Ответ 4



Выше было отвечено как определить гласную букву (через перечисление [aeiouy]), как все остальные символы ([^aeiouy]). Согласную же букву можно определить не через полное их (согласных) перечисление, а через гласные с использованием позитивного просмотра вперед: (?i)^(?=[^aeiouy])[a-z].* (?i) - игнорируем регистр; ^ - начало строки; (?=[^aeiouy]) - позитивный просмотри вперед, проверяем первый символ на несовпадение с гласными буквами без смещения указателя; [a-z] - первый символ должен быть латинской буквой; .* - все остальные символы в строке, если они есть. Думаю так короче будет, чем перечислять все гласные буквы.

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

Отправить комментарий