Expresiones regulares para las palabras PascalCased (también conocido como CamelCased con los principales letra mayúscula)

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

Pregunta

¿Cómo puedo encontrar todas las palabras PascalCased en un documento con una expresión regular?

Si usted no sabe la palabra Pascal entubado, soy sólo se ocupa de que lleva camel case superior (es decir, palabras entubados de camellos en el que la primera letra se escribe con mayúscula).

¿Fue útil?

Solución

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

Suponiendo Inglés. Utilizar clases de caracteres apropiados si lo desea internacionalizar. Esto coincidirá con palabras tales como "este". Si sólo se desea detectar palabras con al menos dos capitales, sólo tiene que utilizar

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

ACTUALIZACIÓN: Como ya he mencionado en un comentario, una versión mejor es:

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

Se detecta cadenas que comienzan con una letra mayúscula, contienen sólo letras y números, y que contienen al menos una letra minúscula y al menos otra letra mayúscula.

Otros consejos

Baja caso de camellos

esta expresión regular incluye el número e implementos estricta minúsculas camello tal como se definen por la Guía de estilo de Google Java validación de expresiones regulares.

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. El primer carácter es minúscula.
  2. Los siguientes elementos son ya sea un solo número o un carácter en mayúscula seguida de bajas caracteres casos.
  3. El último carácter puede ser una mayúscula uno.

Este es un fragmento ilustrar esta expresión regular. Los siguientes elementos son válidos.

xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D

casos camello superior

El mismo principio que el utilizado para la minúscula camello con siempre un carácter en mayúscula inicial.

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

Aquí hay un fragmento que ilustra esta expresión regular. Los siguientes elementos son válidos.

XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D

La expresión regular que se resolvió mi problema (nombrar correctamente los directorios que serán reconocidos por el servicio web FitNesse DbFit) es:

(^[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]$) 

Me ingeniería inversa estas reglas CamelCase particulares, que son:

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

La expresión pasó mi prueba de la siguiente manera:

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

expresiones regulares de Adán Crume está cerca, pero no coincidirá por ejemplo IFoo o HTTPConnection. No estoy seguro sobre los otros, pero darle a éste un intento:

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

Las mismas advertencias en cuanto a la respuesta de Adán con respecto dígitos, I18N, guiones, etc.

Puede probarlo aquí .

Esto parece hacerlo:

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

He incluido pruebas unitarias 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]+)+

debe hacer el truco para el caso de camellos superior. Puede añadir subrayado que conducen a él, así si todavía quiere considerar algo así como _IsRunning caso de camellos superior.

acaba de modificar una de las propuestas de @ AdamCrume:

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

Esto corresponderá con IFrame, pero no ABC. Otras palabras camello-entubado se corresponden, por ejemplo AbcDoesWork, y lo más importante, también coincide con palabras sencillas que no tienen al menos otra letra en mayúsculas , por ejemplo, Frame.

¿Qué opinas de esta versión? Me estoy perdiendo algún caso importante?

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

expresiones regulares de Java para que coincida con la cadena en el caso de camellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top