Регулярное выражение для проверки, если заглавные буквы находятся последовательно в строке? - PullRequest
60 голосов
/ 29 октября 2010

Я хочу знать регулярное выражение для следующего случая:

Строка должна содержать только буквы алфавита. Он должен начинаться с заглавной буквы, за которой следует маленькая буква. Тогда это могут быть строчные или заглавные буквы.

^[A-Z][a-z][A-Za-z]*$

Но строка также не должна содержать никаких последовательных заглавных букв. Как добавить эту логику в регулярное выражение?

То есть HttpHandler правильно, но HTTPHandler неправильно.

Ответы [ 5 ]

137 голосов
/ 29 октября 2010

Всякий раз, когда кто-то пишет [A-Z] или [a-z], он берет на себя обязательство обрабатывать только 7-битные данные ASCII.Если это действительно хорошо, тогда хорошо.Но если это не так, существуют свойства Юникода, чтобы помочь с этим.

В Юникоде есть три случая, а не два.Кроме того, у вас также есть письма без регистра.Буквы в общем случае определяются свойством \pL, и каждая из них также принадлежит ровно к одной из пяти подкатегорий:

  1. заглавные буквы , указанные с помощью \p{Lu};например: AÇDZÞΣSSὩΙST
  2. заглавные буквы , заданные \p{Lt};Например: LjDzSsᾨSt (на самом деле Ss и St являются заглавными, а затем строчными буквами, но они равны , что вы получите, если попросите заглавные буквы ß и соответственно)
  3. строчные буквы , указано \p{Ll};например: aαçdzςσþßᾡſt
  4. буквы-модификаторы , указанные с \p{Lm};Например: ʰʲᴴᴭʺˈˠᵠꜞ
  5. другие буквы , указано \p{Lo};Например: ƻאᎯᚦ京

Вы можете принять дополнение к любому из них, но будьте осторожны, потому что что-то вроде \P{Lu} действительно не означаетбуква не заглавнаяЭто означает любой символ, который не является заглавной буквой.

Для буквы, которая состоит из заглавных или заглавных букв, используйте [\p{Lu}\p{Lt}].Таким образом, вы можете использовать для своего шаблона:

      ^([\p{Lu}\p{Lt}]\p{Ll}+)+$

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

     ^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$

Если вы пытаетесь сопоставить так называемые идентификаторы «CamelCase», то фактические правила зависят от языка программирования, но обычно включают символ подчеркивания и десятичные числа (\p{Nd}) и могут включать буквенный знак доллара.Если это так, вы можете добавить некоторые из них к одному или другому из двух классов символов выше.Например, вы можете добавить подчеркивание к обоим, но цифры только ко второму, оставляя вас с:

     ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$

Если, однако, вы имеете дело с определенными словами из различных RFC и стандартов ISO, эточасто указывается как содержащий только ASCII.Если это так, вы можете обойтись с буквальной идеей [A-Z].Это просто нехорошо навязывать это ограничение, если оно на самом деле не существует.

35 голосов
/ 29 октября 2010

edit: 2015-10-26: спасибо за отклики, но взгляните на ответ tchrist.(один ниже), особенно если вы разрабатываете для Интернета или что-то более «международное».

Ответ Орен Трутнерс не совсем правильный (см. пример ввода «RightHerE», который должен совпадать, но не соответствует)

Вот правильное решение:

(?!^.*[A-Z]{2,}.*$)^[A-Za-z]*$

edit:

(?!^.*[A-Z]{2,}.*$)  // don't match the whole expression if there are two or more consecutive uppercase letters
^[A-Za-z]*$          // match uppercase and lowercase letters

/ edit

ключ к решению - отрицательный взгляд, см .:http://www.regular -expressions.info / lookaround.html

12 голосов
/ 29 октября 2010
^([A-Z][a-z]+)+$

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

5 голосов
/ 06 января 2014

Помимо отличного поста tchrists по поводу юникода, я думаю, вам не нужно комплексное решение с негативным взглядом ... Ваше определение требует заглавной буквы, за которой следует хотя бы одна группа (строчная буква, за которой следует заглавная буква)

^
[A-Z]    // Start with an uppercase Letter
(        // A Group of:
  [a-z]  // mandatory lowercase letter
  [A-Z]? // an optional Uppercase Letter at the end
         // or in between lowercase letters
)+       // This group at least one time
$

Мне кажется, что он немного компактнее и проще для чтения ...

0 голосов
/ 11 сентября 2015

Если вы хотите получить все имена сотрудников в MySQL, которые имеют хотя бы одну заглавную букву, чем применить этот запрос.

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';
...