Как найти все PascalCased слова в документе с регулярным выражением?
Если вы не знаете слова, написанного на Паскале, меня интересует только верхний регистр верблюдов (т.е. слова, написанные на верблюжьих буквах, в которых первая буква заглавная).
Как найти все PascalCased слова в документе с регулярным выражением?
Если вы не знаете слова, написанного на Паскале, меня интересует только верхний регистр верблюдов (т.е. слова, написанные на верблюжьих буквах, в которых первая буква заглавная).
([A-Z][a-z0-9]+)+
Предполагая английский. Используйте соответствующие классы символов, если вы хотите, чтобы он был интернационализирован. Это будет соответствовать словам, таким как "This". Если вы хотите совместить слова только с двумя столицами, просто используйте
([A-Z][a-z0-9]+){2,}
UPDATE: Как я уже упоминал в комментарии, лучшая версия:
[A-Z]([A-Z0-9]*[a-z][a-z0-9]*[A-Z]|[a-z0-9]*[A-Z][A-Z0-9]*[a-z])[A-Za-z0-9]*
Он соответствует строкам, начинающимся с прописной буквы, содержит только буквы и цифры и содержит хотя бы одну строчную букву и хотя бы одну прописную букву.
это регулярное выражение содержит число и реализует строгий нижний регистр верблюдов, как определено проверкой регулярных выражений в Руководстве по стилю Google Java.
[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
Вот фрагмент, иллюстрирующий это регулярное выражение. Следующие элементы являются действительными.
xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D
Тот же принцип, что и тот, который используется для строчных букв верблюда, всегда с начальным верхним регистром.
([A-Z][a-z0-9]+)((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
Вот фрагмент, иллюстрирующий это регулярное выражение. Следующие элементы являются действительными.
XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D
Регулярное выражение, которое решило мою проблему (правильные имена каталогов, которые будут распознаны веб-службой FitNesse DbFit):
(^[A-Z][a-z0-9]+[A-Z]$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+$)|(^[A-Z][a-z0-9]+([A-Z][a-z0-9]+)+[A-Z]$)
Я реконструировал эти конкретные правила CamelCase, они:
1. First character uppercase alpha
2. Next 1-n characters lowercase alphanumeric
3. Next character (n+1) uppercase alpha
4. Next 0 or more characters lowercase alphanumeric
No consecutive uppercase; no special characters.
Pattern may be repeated, e.g. NoChildLeftBehindSuite9102
Выражение прошло мое тестирование следующим образом:
Camel01C is CamelCase syntax
Camel01c01 is not CamelCase syntax
Camel01C01 is CamelCase syntax
Camel01CC01 is not CamelCase syntax
Camel0a1c1 is not CamelCase syntax
Camel0a1C1 is CamelCase syntax
Camel0ac1b1C1 is CamelCase syntax
CamelC is CamelCase syntax
CamelC1 is CamelCase syntax
CamelCA is not CamelCase syntax
CamelCa1 is CamelCase syntax
CamelCa_1 is not CamelCase syntax
IbsReleaseTestVerificationRegressionSuite is CamelCase syntax
IbsReleaseTestVerificationRegressioNSuite is not CamelCase syntax
IbsReleaseTestVerificationRegressioN is CamelCase syntax
Атрибут Adam Crume близок, но не соответствует, например, IFoo
или HTTPConnection
. Не уверен в других, но попробуйте:
\b[A-Z][a-z]*([A-Z][a-z]*)*\b
Те же предостережения, что и для Адама, относятся к цифрам, I18N, подчеркиваниям и т.д.
Вы можете проверить это здесь.
Это похоже на это:
/^[A-Z][a-z]+([A-Z][a-z]+)+/
Я включил модульные тесты Ruby:
require 'test/unit'
REGEX = /^[A-Z][a-z]+([A-Z][a-z]+)+/
class RegExpTest < Test::Unit::TestCase
# more readable helper
def self.test(name, &block)
define_method("test #{name}", &block)
end
test "matches camelcased word" do
assert 'FooBar'.match(REGEX)
end
test "does not match words starting with lower case" do
assert ! 'fooBar'.match(REGEX)
end
test "does not match words without camel hump" do
assert ! 'Foobar'.match(REGEX)
end
test "matches multiple humps" do
assert 'FooBarFizzBuzz'.match(REGEX)
end
end
([A-Z][a-z\d]+)+
Должен сделать трюк для верхового верблюда. Вы также можете добавить к нему соответствующие подчеркивания, если вы все же хотите рассмотреть что-то вроде верхушки верблюда IIRunning.
Только что измененный один из предложений @AdamCrume:
([A-Z]+[a-z0-9]+)+
Это будет соответствовать IFrame
, но не ABC
. Другие слова с верблюжьим слоем сопоставляются, например. AbcDoesWork
, и, самое главное, он также соответствует простым словам, которые не имеют хотя бы еще одну заглавную букву, например. Frame
.
Что вы думаете об этой версии? Я пропустил какой-то важный случай?
([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)