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

Regex для PascalCased слов (или верблюд в верхнем регистре)

Как найти все PascalCased слова в документе с регулярным выражением?

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

4b9b3361

Ответ 1

([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]*

Он соответствует строкам, начинающимся с прописной буквы, содержит только буквы и цифры и содержит хотя бы одну строчную букву и хотя бы одну прописную букву.

Ответ 2

Нижний верблюд

это регулярное выражение содержит число и реализует строгий нижний регистр верблюдов, как определено проверкой регулярных выражений в Руководстве по стилю Google Java.

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. Первый символ в нижнем регистре.
  2. Следующие элементы являются либо одним числом, либо символом верхнего регистра, за которым следуют символы нижнего регистра.
  3. Последний символ может быть заглавным.

Вот фрагмент, иллюстрирующий это регулярное выражение. Следующие элементы являются действительными.

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

Ответ 3

Регулярное выражение, которое решило мою проблему (правильные имена каталогов, которые будут распознаны веб-службой 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

Ответ 4

Атрибут Adam Crume близок, но не соответствует, например, IFoo или HTTPConnection. Не уверен в других, но попробуйте:

\b[A-Z][a-z]*([A-Z][a-z]*)*\b

Те же предостережения, что и для Адама, относятся к цифрам, I18N, подчеркиваниям и т.д.

Вы можете проверить это здесь.

Ответ 5

Это похоже на это:

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

Ответ 6

([A-Z][a-z\d]+)+

Должен сделать трюк для верхового верблюда. Вы также можете добавить к нему соответствующие подчеркивания, если вы все же хотите рассмотреть что-то вроде верхушки верблюда IIRunning.

Ответ 7

Только что измененный один из предложений @AdamCrume:

([A-Z]+[a-z0-9]+)+

Это будет соответствовать IFrame, но не ABC. Другие слова с верблюжьим слоем сопоставляются, например. AbcDoesWork, и, самое главное, он также соответствует простым словам, которые не имеют хотя бы еще одну заглавную букву, например. Frame.

Что вы думаете об этой версии? Я пропустил какой-то важный случай?

Ответ 8

([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)