Domanda

Come faccio a trovare tutte le parole PascalCased in un documento con un'espressione regolare?

Se non si conosce la parola Pascal cased, sono preoccupato solo con i principali caso cammello superiore (vale a dire, cammello parole con carter in cui la prima lettera è maiuscola).

È stato utile?

Soluzione

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

Supponendo inglese. Utilizzare classi di personaggi appropriati se lo vuoi internazionalizzabile. Ciò corrisponderà parole come "questo". Se si desidera far corrispondere solo le parole con almeno due capitali, basta usare

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

UPDATE: Come ho già detto in un commento, una versione migliore è:

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

Si abbina stringhe che iniziano con una lettera maiuscola, contengono solo lettere e numeri, e contengono almeno una lettera minuscola e almeno un altro lettera maiuscola.

Altri suggerimenti

Bassa caso cammello

questo regex comprende numero e implementa rigoroso minuscola cammello come definito dalla Google Guida Java Stile convalida regex.

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. Il primo carattere è minuscolo.
  2. I seguenti elementi sono sia un singolo numero o un carattere maiuscolo seguito da inferiori casi caratteri.
  3. L'ultimo carattere può essere un caso superiore uno.

Ecco un frammento che illustra questo regex. I seguenti elementi sono validi.

xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D

Alta caso cammello

Lo stesso principio come quello utilizzato per il caso del cammello inferiore con sempre un carattere maiuscolo di partenza.

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

Ecco un frammento che illustra questo regex. I seguenti elementi sono validi.

XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D

Anche l'espressione regolare che ha risolto il mio problema (denominazione correttamente le directory che verranno riconosciuti dal servizio 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 reverse engineering questi particolari regole CamelCase, essi sono:

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'espressione superato il mio test come segue:

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 di Adam Crume è vicino, ma non corrisponderà ad esempio IFoo o HTTPConnection. Non sono sicuro circa gli altri, ma dare questa una prova:

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

Gli stessi avvertimenti come la risposta di Adam per quanto riguarda le cifre, I18N, sottolineature ecc.

È possibile verificare il lavoro svolto qui .

Questo sembra farlo:

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

Ho incluso test di unità di 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]+)+

dovrebbe fare il trucco per caso cammello superiore. È possibile aggiungere sottolineature che conducono ad esso pure se si vuole ancora di prendere in considerazione qualcosa di simile _IsRunning caso cammello superiore.

Just modificato uno dei @ di AdamCrume proposte:

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

Questa corrisponderà IFrame, ma non ABC. Altre parole cammello-carter sono abbinati, ad esempio AbcDoesWork, e, soprattutto, corrisponde anche semplici parole che non hanno almeno un'altra lettera maiuscola , per esempio Frame.

Cosa ne pensate di questa versione? Mi sto perdendo qualche 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 per abbinare stringa sul caso cammello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top