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).

Était-ce utile?

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])?
  1. Le premier caractère est minuscule.
  2. Les éléments suivants sont soit un nombre unique ou un caractère majuscule suivie de minuscules caractères.
  3. 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

regex d'Adam Crume est proche, mais ne correspond pas à IFoo par exemple ou HTTPConnection. Je ne sais pas sur les autres, mais donner l'essayer:

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

Les mêmes mises en garde que pour la réponse d'Adam concernant les chiffres, I18N, etc underscores.

Vous pouvez le tester .

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top