Expresiones regulares para las palabras PascalCased (también conocido como CamelCased con los principales letra mayúscula)
-
13-09-2019 - |
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).
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])?
- El primer carácter es minúscula.
- Los siguientes elementos son ya sea un solo número o un carácter en mayúscula seguida de bajas caracteres casos.
- 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.