PascalCased 单词的正则表达式(又名 camelCased,前导大写字母)
Posted
技术标签:
【中文标题】PascalCased 单词的正则表达式(又名 camelCased,前导大写字母)【英文标题】:Regex for PascalCased words (aka camelCased with leading uppercase letter) 【发布时间】:2010-11-10 19:52:43 【问题描述】:如何使用正则表达式在文档中找到所有 PascalCased 单词?
如果您不知道 Pascal 大小写这个词,我只关心前导 大驼峰式(即首字母大写的驼峰式单词)。
【问题讨论】:
我只想指出,您所描述的是 PascalCase。 CamelCase 专门指第一个字母为小写字母且所有后续单词均以大写字母开头的单词。 肯定是 PascalCase 这是camelCase 【参考方案1】:([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]*
它匹配以大写字母开头、仅包含字母和数字、至少包含一个小写字母和至少一个其他大写字母的字符串。
【讨论】:
带有大写字符子序列或以大写字符结尾的单词呢? 如果您只想匹配包含多个大写字符的单词,可以这样:([AZ][a-z0-9]*)2, 对,但它也匹配全大写单词,(IMO)不应该被视为驼峰式。 好的,然后:[AZ]([A-Z0-9]*[az][a-z0-9]*[AZ]|[a-z0-9]*[AZ] [A-Z0-9]*[az])[A-Za-z0-9]* 匹配以大写字母开头,仅包含字母和数字,并且至少包含一个小写字母和至少一个其他字母的字符串大写字母。【参考方案2】:小驼峰
此正则表达式包含数字并实现了Google Java Style Guide 定义的严格的小写驼峰式 正则表达式验证。
[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])?
这是一个说明这个正则表达式的 sn-p。以下元素是有效的。
XmlHttpRequest
NewCustomerId
InnerStopwatch
SupportsIpv6OnIos
YouTubeImporter
YoutubeImporter
Affine3D
【讨论】:
驼峰大写正则表达式允许以数字开头的字符串 @HosseinAgha 我进行了更新以排除倾斜数字,感谢您的反馈【参考方案3】:解决我的问题的正则表达式(正确命名将被 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]$)
我对这些特殊的 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
【讨论】:
【参考方案4】:Adam Crume 的正则表达式很接近,但不匹配,例如 IFoo
或 HTTPConnection
。不确定其他的,但试试这个:
\b[A-Z][a-z]*([A-Z][a-z]*)*\b
与亚当关于数字、I18N、下划线等的回答相同的警告。
你可以测试一下here。
【讨论】:
问题是这个也会将Class
检测为驼峰式单词。【参考方案5】:
这似乎可以做到:
/^[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
【讨论】:
Adam 的更好,它通过了我写的所有测试。【参考方案6】:([A-Z][a-z\d]+)+
应该为大骆驼案做的伎俩。如果您仍想考虑类似 _IsRunning 大驼峰大小写的内容,也可以为其添加前导下划线。
【讨论】:
【参考方案7】:刚刚修改了@AdamCrume 的一项提案:
([A-Z]+[a-z0-9]+)+
这将匹配IFrame
,但不匹配ABC
。匹配其他驼峰式单词,例如AbcDoesWork
,最重要的是,它还匹配至少没有另一个大写字母的简单单词,例如Frame
.
你觉得这个版本怎么样?我错过了一些重要的案例吗?
【讨论】:
【参考方案8】:([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)
java 正则表达式匹配骆驼大小写的字符串。
【讨论】:
以上是关于PascalCased 单词的正则表达式(又名 camelCased,前导大写字母)的主要内容,如果未能解决你的问题,请参考以下文章