#регулярные_выражения #perl
Задача из книжки. Написать регулярку, которая проверяет соответствие строковой переменной правилу: есть хотя бы одна буква в верхнем регистре есть хотя бы одна буква в нижнем регистре эти 2 символа идут подряд, порядок не имеет значения Для простоты, считаем, что строки не содержат переводов строк. Я написал что-то такое: /[a-z]*[A-Z]+[a-z]*/ или /[a-z]*[A-Z]+[a-z]+/ Предлагается потестить на строках типа "fred", "Fred" и "frEd". Я нашел одно слово, с которым данный шаблон не совпадает, это "freD". Как обобщить регулярку на все возможные строки? Ответ в книге про перл еще хуже, чем мое решение.
Ответы
Ответ 1
/([a-z][A-Z])|([A-Z][a-z])/ Разве это не в точности соответствует поставленному условию? foreach (qw/fred FRED fRed Fred freD 1234/) { if (/([a-z][A-Z])|([A-Z][a-z])/) { print "$_ - ok\n"; } else { print "$_ - bad\n"; } } вывод: fred - bad FRED - bad fRed - ok Fred - ok freD - ok 1234 - bad П.С. Круглые скобки в регулярке - необязательны, но я предпочитаю их ставить в такой ситуации.Ответ 2
Если слово начинается с больших - ищем маленькую, если с маленьких - большую \b([A-Z]+[a-z]|[a-z]+[A-Z])[A-Za-z]*\b демоОтвет 3
Как насчет [^A-Z]+[A-Z]+|[A-Z]+[^A-Z]+?Ответ 4
Можно упростить и регулярку и само решение: sub check_string { ($_[0]=~/([a-z]?[A-Z][a-z]?)/ and length $1 > 1) ? 1 : 0; } print check_string($_) for qw/ fREd fRed Fred FRED freD 88a9 /;
Комментариев нет:
Отправить комментарий