如何使用正则表达式在文档中查找所有 PascalCase 单词?
如果您不知道 Pascal case 的含义,我只关心前导大写驼峰命名(即首字母大写的驼峰命名单词)。
如何使用正则表达式在文档中查找所有 PascalCase 单词?
如果您不知道 Pascal case 的含义,我只关心前导大写驼峰命名(即首字母大写的驼峰命名单词)。
([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]$)
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
Class
识别为驼峰命名单词。 - Whitecat/^[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
刚刚修改了@AdamCrume的一个提议:
([A-Z]+[a-z0-9]+)+
IFrame
,但不匹配 ABC
。其他驼峰命名的单词会被匹配,例如 AbcDoesWork
,最重要的是,它还可以匹配没有至少一个大写字母的简单单词,例如 Frame
。([A-Z][a-z\d]+)+
^[A-Z](([a-z]+[A-Z]?)*)$
^[A-Z](([a-z0-9]+[A-Z]?)*)$
测试用例:https://regex101.com/library/csrkQw
支持2-3个字母大写缩写,例如IOStream
、StreamIO
、DeviceID
、deviceID
、AwsVPC
、awsVPC
、serialNO
、SerialNO
、deviceSN
、DeviceSN
。这种变体受到了微软的Capitalization Convention的启发。
^[A-Z](([A-Z]{1,2}[a-z0-9]+)+([A-Z]{1,3}[a-z0-9]+)*[A-Z]{0,3}|([a-z0-9]+[A-Z]{0,3})*|[A-Z]{1,2})$
([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)
Java正则表达式匹配驼峰命名字符串。