web-dev-qa-db-ja.com

PascalCased語の正規表現(別名camelCased、先頭は大文字)

正規表現を使用してドキュメント内のすべての PascalCased 単語を検索するにはどうすればよいですか?

Pascalの大文字小文字の区別がわからない場合は、先頭のキャメル大文字(つまり、最初の文字が大文字です)。

35
Tom Lehman
([A-Z][a-z0-9]+)+

英語を想定しています。国際化可能にする場合は、適切な文字クラスを使用してください。これは「This」などの単語に一致します。大文字が2つ以上ある単語のみを一致させたい場合は、

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

更新:私がコメントで述べたように、より良いバージョンは:

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

大文字で始まり、文字と数字のみを含み、少なくとも1つの小文字と少なくとも1つの他の大文字を含む文字列に一致します。

57
Adam Crume

キャメルケース

Google Java Style Guide regex validationで定義されているように、この正規表現は番号を含み、厳密なラクダの小文字を実装します。

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. 最初の文字は小文字です。
  2. 次の要素は、1つの数字、または大文字の後に小文字が続くものです。
  3. 最後の文字は大文字にすることができます。

snippet はこの正規表現を示しています。以下の要素が有効です。

xmlHttpRequest
newCustomerId
innerStopwatch
supportsIpv6OnIos
youTubeImporter
youtubeImporter
affine3D

キャメル上ケース

キャメルの小文字に使用されるものと同じ原則で、常に大文字で始まります。

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

これは、この正規表現を示すスニペットです。以下の要素が有効です。

XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D
6

私の問題を解決した正規表現(FitNesse DbFit Webサービスによって認識されるディレクトリに適切に名前を付ける)は次のとおりです。

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

これらの特定のキャメルケースルールをリバースエンジニアリングしました。

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

式は次のように私のテストに合格しました:

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
6
Billy Baroo

Adam Crumeの正規表現は近いですが、たとえばIFooHTTPConnectionとは一致しません。他についてはわかりませんが、これを試してみてください:

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

数字、I18N、アンダースコアなどに関するAdamの回答と同じ警告。

あなたはそれをテストすることができます ここ

5
Vinay Sajip

これはそれをするようです:

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

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
2
nakajima
([A-Z][a-z\d]+)+

上部キャメルケースのトリックを行う必要があります。 _IsRunningの上部キャメルケースなどを引き続き検討する場合は、先頭にアンダースコアを追加することもできます。

1
ahawker

@AdamCrumeの提案の1つを変更しただけです。

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

これはIFrameと一致しますが、ABCとは一致しません。その他のキャメルケースの単語が一致します。 AbcDoesWork、そして最も重要なのはこれは、少なくとももう1つの大文字が含まれていない単純な単語にも一致しますFrame

このバージョンについてどう思いますか?私はいくつかの重要なケースを見逃していますか?

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

キャメルケースの文字列に一致するJava正規表現。

0
Mahesh Yadav