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

StackOverflow https://stackoverflow.com/questions/1128305

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Регулярное выражение Адама Крама близко, но, например, не соответствует 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]+)+

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

Только что изменил одно из предложений @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]*)*)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top