如何使用正则表达式在文档中查找所有PascalCased单词?
如果您不知道 Pascal 大小写这个词,我只关心大写驼峰大小写(即首字母大写的驼峰大小写单词)。
如何使用正则表达式在文档中查找所有PascalCased单词?
如果您不知道 Pascal 大小写这个词,我只关心大写驼峰大小写(即首字母大写的驼峰大小写单词)。
([A-Z][a-z0-9]+)+
假设英语。如果您希望它可国际化,请使用适当的字符类。这将匹配诸如“This”之类的单词。如果您只想匹配至少有两个大写字母的单词,只需使用
([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]*
它匹配以大写字母开头、仅包含字母和数字、并且至少包含一个小写字母和至少一个其他大写字母的字符串。
此正则表达式包含数字并实现严格的小驼峰式大小写,如Google Java 样式指南 正则表达式验证所定义。
[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
这是说明此正则表达式的片段。以下元素是有效的。
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]$)
我对这些特定的 CamelCase 规则进行了逆向工程,它们是:
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
or HTTPConnection
。不确定其他的,但试试这个:
\b[A-Z][a-z]*([A-Z][a-z]*)*\b
与亚当关于数字、I18N、下划线等的回答相同的警告。
你可以在这里测试一下。
这似乎做到了:
/^[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 的一项提案:
([A-Z]+[a-z0-9]+)+
这将匹配IFrame
,但不是ABC
。匹配其他驼峰式单词,例如AbcDoesWork
,最重要的是,它还匹配至少没有另一个大写字母的简单单词,例如Frame
。
你觉得这个版本怎么样?我错过了一些重要的案例吗?
([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)
java 正则表达式以匹配骆驼大小写的字符串。