Регулярное выражение для проверки, находятся ли заглавные буквы последовательно в строке?
Я хочу знать регулярное выражение для следующего случая:
эта строка должна содержать только алфавитные буквы. Она должна начинаться с заглавной буквы, за которой следует маленькая буква. Тогда это могут быть маленькие буквы или заглавные буквы.
^[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
свойство, и каждый из них также относится ровно к одной из пяти подкатегорий:
-
верхний письма!--31-->, указан с
\p{Lu}
, например:AÇDZÞΣSSὩΙST
-
titlecase буквы, указан с
\p{Lt}
, например:LjDzSsᾩSt
(на самом делеSs
иSt
являются верхней, а затем строчной буквой, но они are что вы получите, если попросите titlecaseß
иſt
, соответственно) -
строчные буквы, указан с
\p{Ll}
, например:aαçdzςσþßᾡſt
-
модификатор буквы, указано с помощью
\p{Lm}
, например:ʰʲᴴᴭʺˈˠᵠ
-
другие буквы, указан с
\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]';