Expressão regular para identificar palavras CamelCased com letra maiúscula

Como faço para encontrar todas as palavras CamelCased em um documento com uma expressão regular? Eu estou preocupado apenas com a liderança do caso do camelo Superior (isto é, palavras maiúsculas de camelo nas quais a primeira letra é maiúscula).

([AZ][a-z0-9]+)+ 

Assumindo o inglês. Use classs de caracteres apropriadas se você quiser internacionalizá-las. Isso irá corresponder palavras como “This”. Se você quiser apenas combinar palavras com pelo menos duas maiúsculas, basta usar

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

ATUALIZAÇÃO: Como mencionei em um comentário, uma versão melhor é:

 [AZ]([A-Z0-9]*[az][a-z0-9]*[AZ]|[a-z0-9]*[AZ][A-Z0-9]*[az])[A-Za-z0-9]* 

Ele corresponde cadeias de caracteres que começam com uma letra maiúscula, contêm apenas letras e números e contêm pelo menos uma letra minúscula e pelo menos uma outra letra maiúscula.

O regexp que resolveu meu problema (apropriadamente nomeando diretórios que serão reconhecidos pelo serviço da web FitNesse DbFit) é:

 (^[AZ][a-z0-9]+[AZ]$)|(^[AZ][a-z0-9]+([AZ][a-z0-9]+)+$)|(^[AZ][a-z0-9]+([AZ][a-z0-9]+)+[AZ]$) 

Eu fiz engenharia reversa dessas regras particulares do CamelCase, elas são:

 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, eg NoChildLeftBehindSuite9102 

A expressão passou no meu teste da seguinte forma:

 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 

Caso de camelo inferior

Esse regex inclui o número e implementa o caso estrito de camelo inferior, conforme definido pela validação de regex do Google Java Style Guide .

 [az]+((\d)|([A-Z0-9][a-z0-9]+))*([AZ])? 
  1. O primeiro caractere é minúsculo.
  2. Os elementos a seguir são um único número ou um caractere maiúsculo, seguidos por caracteres minúsculos.
  3. O último caractere pode ser um maiúsculo.

Aqui está um trecho ilustrando este regex. Os elementos a seguir são válidos.

 xmlHttpRequest newCustomerId innerStopwatch supportsIpv6OnIos youTubeImporter youtubeImporter affine3D 

Caso de camelo superior

O mesmo princípio usado para o caso de camelo inferior, sempre com um caractere inicial maiúsculo.

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

Aqui está um trecho ilustrando este regex. Os elementos a seguir são válidos.

 XmlHttpRequest NewCustomerId InnerStopwatch SupportsIpv6OnIos YouTubeImporter YoutubeImporter Affine3D 

O regex de Adam Crume está próximo, mas não combina, por exemplo, IFoo ou HTTPConnection . Não tenho certeza sobre os outros, mas experimente este:

 \b[AZ][az]*([AZ][az]*)*\b 

As mesmas advertências que para a resposta de Adam em relação a dígitos, I18N, sublinhados, etc.

Você pode testá-lo aqui .

Isso parece fazer isso:

 /^[AZ][az]+([AZ][az]+)+/ 

Eu incluí testes de unidade do Ruby:

 require 'test/unit' REGEX = /^[AZ][az]+([AZ][az]+)+/ 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 

Apenas modifiquei uma das propostas da @ AdamCrume:

 ([AZ]+[a-z0-9]+)+ 

Isso corresponderá ao IFrame , mas não ao ABC . Outras palavras camel-cased são combinadas, por exemplo, AbcDoesWork , e mais importante, também combina palavras simples que não têm pelo menos outra letra maiúscula , por exemplo, Frame .

O que você acha desta versão? Estou perdendo algum caso importante?

 ([AZ][az\d]+)+ 

Deve fazer o truque para o caso do camelo superior. Você também pode adicionar sublinhados para ele se ainda quiser considerar algo como o caso de camelo superior de IsRunning.

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