正規表現を使用してドキュメント内のすべての PascalCased 単語を検索するにはどうすればよいですか?
Pascalの大文字小文字の区別がわからない場合は、先頭のキャメル大文字(つまり、最初の文字が大文字です)。
([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つの他の大文字を含む文字列に一致します。
Google Java Style Guide regex validationで定義されているように、この正規表現は番号を含み、厳密なラクダの小文字を実装します。
[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
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
私の問題を解決した正規表現(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
Adam Crumeの正規表現は近いですが、たとえばIFoo
やHTTPConnection
とは一致しません。他についてはわかりませんが、これを試してみてください:
\b[A-Z][a-z]*([A-Z][a-z]*)*\b
数字、I18N、アンダースコアなどに関するAdamの回答と同じ警告。
あなたはそれをテストすることができます ここ 。
これはそれをするようです:
/^[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
([A-Z][a-z\d]+)+
上部キャメルケースのトリックを行う必要があります。 _IsRunningの上部キャメルケースなどを引き続き検討する場合は、先頭にアンダースコアを追加することもできます。
@AdamCrumeの提案の1つを変更しただけです。
([A-Z]+[a-z0-9]+)+
これはIFrame
と一致しますが、ABC
とは一致しません。その他のキャメルケースの単語が一致します。 AbcDoesWork
、そして最も重要なのはこれは、少なくとももう1つの大文字が含まれていない単純な単語にも一致します。 Frame
。
このバージョンについてどう思いますか?私はいくつかの重要なケースを見逃していますか?
([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)
キャメルケースの文字列に一致するJava正規表現。