Регулярное выражение для слов PascalCased (также известных как camelCased с ведущей заглавной буквой)

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

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


person Tom Lehman    schedule 14.07.2009    source источник
comment
Я просто хочу отметить, что то, что вы описываете, - это PascalCase. CamelCase относится конкретно к словам, в которых первая буква строчная, а все последующие слова начинаются с прописной буквы.   -  person Jens Bodal    schedule 02.11.2017
comment
Определенно PascalCase это camelCase   -  person Jacob    schedule 29.12.2018


Ответы (8)


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

Предполагая английский язык. Используйте соответствующие классы символов, если вы хотите интернационализировать его. Это будет соответствовать таким словам, как «Это». Если вы хотите сопоставлять только слова, написанные как минимум двумя заглавными буквами, просто используйте

([A-Z][a-z0-9]+){2,}

ОБНОВЛЕНИЕ: Как я уже упоминал в комментарии, лучшая версия:

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

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

person Adam Crume    schedule 14.07.2009
comment
Как насчет слов с последовательностью символов верхнего регистра или заканчивающихся символом верхнего регистра? - person ephemient; 15.07.2009
comment
Если вы хотите сопоставить только слова с более чем одним символом верхнего регистра, это будет примерно так: ([A-Z][a-z0-9]*){2,} - person Adam Crume; 15.07.2009
comment
Верно, но это также соответствует всем словам в верхнем регистре, которые (IMO) не следует рассматривать как CamelCase. - person ephemient; 15.07.2009
comment
Хорошо, тогда: [AZ]([A-Z0-9]*[az][a-z0-9]*[AZ]|[a-z0-9]*[AZ][A-Z0-9]* [az])[A-Za-z0-9]* Соответствует строкам, начинающимся с заглавной буквы, содержащим только буквы и цифры и содержащим по крайней мере одну строчную букву и по крайней мере еще одну прописную букву. - person Adam Crume; 15.07.2009

Нижний верблюжий корпус

это регулярное выражение включает число и реализует строго нижний верблюжий регистр, как определено в Руководство по стилю 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
person Nicolas Henneaux    schedule 01.12.2017
comment
регулярное выражение в верхнем регистре допускает строки, начинающиеся с цифр - person HosseinAgha; 02.07.2019
comment
@HosseinAgha Я сделал обновление, чтобы исключить наклонные числа, спасибо за ваш отзыв. - person Nicolas Henneaux; 03.07.2019

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

Регулярное выражение Адама Крума близко, но не будет соответствовать, например, IFoo или HTTPConnection. Не уверен насчет других, но попробуйте этот:

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

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

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

person Vinay Sajip    schedule 14.07.2009
comment
Проблема в том, что этот также обнаружит Class как слово в падеже верблюда. - person Whitecat; 19.03.2015

Это, кажется, делает это:

/^[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
person nakajima    schedule 14.07.2009
comment
Адамов лучше, и он проходит все тесты, которые я написал. - person nakajima; 15.07.2009

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

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

person ahawker    schedule 14.07.2009

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

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

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

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

person logc    schedule 25.02.2014

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

java regex для соответствия строке в случае верблюда.

person Mahesh Yadav    schedule 12.03.2018