Pergunta

Como posso encontrar todas as palavras PascalCased em um documento com uma expressão regular?

Se você não sabe a palavra Pascal encaixotado, eu só estou preocupado com os principais caso camelo superior (ou seja, camelo palavras encamisado, em que a primeira letra é maiúscula).

Foi útil?

Solução

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

Assumindo Inglês. Use classes de personagens apropriados se quiser internationalizable. Isso irá corresponder a palavras como "este". Se você quiser corresponder apenas palavras com pelo menos duas capitais, basta usar

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

UPDATE: Como mencionei em um comentário, uma versão melhor é:

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

Ele corresponde cordas 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.

Outras dicas

Baixa caso camelo

esta expressão regular inclui número e implementos estrito de casos camelo inferior , tal como definido por a Guia de Estilo Google Java validação regex.

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. O primeiro caractere é minúsculas.
  2. Os seguintes elementos são ou um número único ou uma personagem maiúscula seguida de casos inferiores caracteres.
  3. O último personagem pode ser um um maiúsculas.

Aqui é um trecho ilustram este regex. Os seguintes elementos são válidos.

xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D

Alta caso camelo

Mesmo princípio que o utilizado para minúsculas camelo com sempre um caráter maiúscula inicial.

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

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

XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D

O regexp que resolveu o meu problema (devidamente nomear diretórios que serão reconhecidas pelo serviço de web 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]$) 

I engenharia reversa essas as regras do CamelCase particulares, que 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, e.g. NoChildLeftBehindSuite9102

A expressão passou o 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

regex de Adão Crume está perto, mas não irá corresponder por exemplo IFoo ou HTTPConnection. Não tenho certeza sobre os outros, mas dar um presente uma tentativa:

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

As mesmas ressalvas como a resposta de Adam sobre dígitos, I18N, sublinhados etc.

Você pode testá-lo aqui .

Este parece fazê-lo:

/^[A-Z][a-z]+([A-Z][a-z]+)+/

Eu incluí testes de unidade 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]+)+

Deve fazer o truque para caso camelo superior. Você pode adicionar sublinhados que levam a isso, bem como se você ainda considerar algo como _IsRunning caso camelo superior.

Apenas modificado um dos @ propostas de AdamCrume:

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

Isso irá corresponder IFrame, mas não ABC. Outras palavras encaixotado-camelo são combinados, por exemplo, AbcDoesWork, eo mais importante, isso também corresponde palavras simples que não têm pelo menos uma outra letra maiúscula , por exemplo, Frame.

O que você acha desta versão? Estou faltando alguma caso importante?

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

java regex para coincidir com corda no caso camelo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top