Страницы

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

вторник, 10 декабря 2019 г.

Совпадение со строками, содержащими заглавные буквы, но не полностью состоящими из них

#регулярные_выражения #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 /;

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

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