Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Редактировать: 2015-10-26: спасибо за отклики, но взгляните на ответ tchrist, особенно если вы разрабатываете для Интернета или что-то более "международное".

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

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

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

изменение:

(?!^.*[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

/редактировать

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

Ответ 2

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

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

  1. заглавные буквы, указанные с помощью \p{Lu}; например: AÇDZÞΣSSὩΙST
  2. буквы заглавных букв, указанные с помощью \p{Lt}; Например: LjDzSsᾨSt (на самом деле Ss и St - это upper-, а затем строчная буква, но они - то, что вы получите, если спросите заглавные буквы ß и соответственно)
  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. Если это так, вы можете обойтись буквальной идеей [AZ]. Просто нехорошо навязывать это ограничение, если оно на самом деле не существует.

Ответ 3

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

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

Ответ 4

Помимо отличного сообщения 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
$

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

Ответ 5

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

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