Regex pour les mots PascalCased (aka notationCamel avec les principales lettre majuscule)
-
13-09-2019 - |
Question
Comment puis-je trouver tous les PascalCased mots dans un document avec une expression régulière?
Si vous ne connaissez pas le mot Pascal tubé, je suis seulement préoccupé par premier Majuscules camel (par exemple, chameau mots tubé dans lequel la première lettre est mise en majuscule).
La solution
([A-Z][a-z0-9]+)+
En supposant l'anglais. Utilisez les classes de caractères appropriés si vous le voulez internationalisable. Cela correspondra à des mots tels que « Ce ». Si vous voulez faire correspondre uniquement les mots avec au moins deux capitales, il suffit d'utiliser
([A-Z][a-z0-9]+){2,}
Mise à jour: Comme je l'ai mentionné dans un commentaire, une meilleure version est:
[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]*
Il correspond à des chaînes qui commencent par une lettre majuscule, ne contiennent que des lettres et des chiffres, et contiennent au moins une lettre minuscule et au moins une autre lettre majuscule.
Autres conseils
Minuscules camel
regex comprend nombre et instruments cas stricte de chameau inférieure au sens de la Google Java Guide de style validation regex.
[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
- Le premier caractère est minuscule.
- Les éléments suivants sont soit un nombre unique ou un caractère majuscule suivie de minuscules caractères.
- Le dernier caractère peut être un cas supérieur.
Voici un extrait illustrant ce regex. Les éléments suivants sont valables.
xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D
Majuscules camel
Le même principe que celui utilisé pour le cas de chameau inférieur avec toujours un caractère majuscule départ.
([A-Z][a-z0-9]+)((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
Voici un extrait illustrant cette regex. Les éléments suivants sont valables.
XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D
L'expression rationnelle qui a résolu mon problème (nommer correctement les répertoires qui seront reconnus par le service Web FitNesse DbFit) est:
(^[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]$)
J'inverse Engineered ces règles CamelCase particulières, ils sont:
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
L'expression a passé mes tests comme suit:
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
Cela semble le faire:
/^[A-Z][a-z]+([A-Z][a-z]+)+/
J'ai inclus des tests unitaires 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]+)+
devrait faire l'affaire pour le cas de chameau supérieure. Vous pouvez ajouter les traits de soulignement à lui aussi bien si vous voulez toujours envisager quelque chose comme _IsRunning majuscules de chameau.
Il suffit de modifier l'une des propositions de @ AdamCrume:
([A-Z]+[a-z0-9]+)+
Cela correspond IFrame
, mais pas ABC
. D'autres mots de CamelCase correspondent, par exemple, AbcDoesWork
, et surtout, il correspond également à des mots simples qui ne sont pas au moins une autre lettre majuscule , par exemple Frame
.
Que pensez-vous de cette version? Est-ce que je manque une affaire importante?
([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)
java regex en chaîne sur le cas de chameau.