Regex для верблюжьих слов с заглавными буквами - PullRequest
29 голосов
/ 15 июля 2009

Как найти все CamelCased слова в документе с регулярным выражением? Меня интересует только ведущий Верхний регистр верблюдов (т.е. слова в верблюжьих буквах, в которых первая буква заглавная).

Ответы [ 8 ]

51 голосов
/ 15 июля 2009
([A-Z][a-z0-9]+)+

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

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

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

6 голосов
/ 01 декабря 2017

Нижний верблюжий чехол

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

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

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

xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D

Верхний кейс для верблюда

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

((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?

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

XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D
5 голосов
/ 13 июля 2015

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

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

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

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

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

2 голосов
/ 15 июля 2009

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

/^[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
1 голос
/ 25 февраля 2014

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

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

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

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

1 голос
/ 15 июля 2009
([A-Z][a-z\d]+)+

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

0 голосов
/ 12 марта 2018

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

Java регулярное выражение для сопоставления строки в случае верблюда.

...