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

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

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

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

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

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

5 ответов


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

Oren Trutners ответ не совсем правильный (см. пример ввода "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

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


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

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

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

вы can возьмите состав любого из них, но будьте осторожны, потому что что-то вроде \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}]+)+$

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


^([A-Z][a-z]+)+$

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


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

^
[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
$

просто немного компактнее и легче читать, я думаю...


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

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