大写和小写驼峰命名法

7

我试图编写一个适用于大驼峰命名和小驼峰命名的正则表达式。

这是我尝试的正则表达式:

(([A-Z][a-z0-9]*){2,}|([a-z][A-Z0-9]*){2,})

尝试使用以下正则表达式匹配大驼峰命名法 - ([A-Z][a-z0-9]){2,},但是它也会匹配其他组合。第二部分也是类似的情况 - ([a-z][A-Z0-9]){2,})。


“{2,}”的意思是什么?禁止使用单个字母变量? - SWeko
这是为了确保([A-Z][a-z0-9])或([a-z][A-Z0-9])至少出现两次。@SWeko - Ankit
你能给一些测试文本的例子吗? - JackDev
大驼峰命名法 - "CamelCase1" 小驼峰命名法 - "camelCase2" @JackDev - Ankit
3个回答

4
这将匹配包含至少一个大写字母的大小写混合短语。 大驼峰命名法
[A-Z][a-z0-9]*[A-Z0-9][a-z0-9]+[A-Za-z0-9]*

示例:HelloWorld,AQuickBrownFox

小驼峰命名法

[a-z]+[A-Z0-9][a-z0-9]+[A-Za-z0-9]*

example: helloWorld, aQuickBrownFox


所以,在UpperCamelCase中,只有UpperCamel会被匹配。这是有意为之的吗?那么,您不想使用单词边界锚点来确保第一个正则表达式不匹配(子字符串)thisIsNotUpperCamelCase吗?此外,应该是[A-Z]而不是[A-Z0-9]。最后(OP没有提到这一点),非ASCII变量名怎么办?许多语言允许在变量名中使用Unicode字符。 - Tim Pietzcker
1
但是 lowerCamelCase 正则表达式也匹配像 A 或者 ABC 这样的字符串!我认为它应该是 [a-z]+[A-Z0-9][a-z0-9]*。请注意,这里使用了 + 而不是 * - gehho
我还更新了我的正则表达式以处理更复杂的匹配。 - JackDev

2
小驼峰命名法 - 不允许使用数字

    ^[a-z][a-z]*(([A-Z][a-z]+)*[A-Z]?|([a-z]+[A-Z])*|[A-Z])$
    

测试用例:https://regex101.com/library/4h7A1I

小驼峰式命名法 - 允许数字


    ^[a-z][a-z0-9]*(([A-Z][a-z0-9]+)*[A-Z]?|([a-z0-9]+[A-Z])*|[A-Z])$


测试用例:

测试用例:https://regex101.com/library/8nQras

小驼峰命名法 - 允许数字 - 最多3个大写字母

要匹配多个大写字母(例如deviceIDserialNOawsVPCdeviceSN),需要稍微复杂一些:

 
    ^[a-z][a-z0-9]*(([A-Z]{1,3}[a-z0-9]+)*[A-Z]{0,3}|([a-z0-9]+[A-Z]{1,3})*|[A-Z]{1,3})$


测试用例:https://regex101.com/library/C2eHyc

Pascal Case - 不允许使用数字


    ^[A-Z](([a-z]+[A-Z]?)*)$


测试用例:

链接:https://regex101.com/library/sF2jRZ

Pascal Case - 允许数字


    ^[A-Z](([a-z0-9]+[A-Z]?)*)$


测试用例: https://regex101.com/library/csrkQw

Pascal Case - 允许数字 - 最多3个大写字母

为了匹配多于一个大写字母(例如:DeviceIDSerialNoAwsVPCIOStreamStreamIODeviceSN),需要稍微复杂一些:


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


测试用例:https://regex101.com/library/TLTXbK 若想了解驼峰命名法和帕斯卡命名法的更多细节,请查看此代码库

0

对于 lowerCamelCase,您需要:

  1. 一个小写字母
  2. 至少一个(小写字母或大写字母或数字)

因此,适当的正则表达式应该是

[a-z][a-zA-Z0-9]+

同样地,针对 UpperCamelCase,你将有 [A-Z][a-zA-Z0-9]+,如果你将其分组,你就会得到

[a-zA-Z][a-zA-Z0-9]+

编辑:如果您严格要求一个单词成为驼峰式单词,它必须有一个“驼峰”,其中驼峰是大写字母或数字,则需要:

  1. 一个大写或小写字母,后跟
  2. 其他小写字母(可能没有),后跟
  3. 一个驼峰,后跟
  4. 其他小写字母(可能没有),
  5. 可能后面跟着另一个或多个驼峰

然后您的正则表达式是:

[a-zA-Z][a-z]*([A-Z0-9]+[a-z]*)+

但这也会匹配“aa”,而“aa”不是驼峰命名法,对吧? - Ankit
1
lowerCamelCase 是指变量名以小写字母开头,后面的单词首字母大写。例如,变量名为 lower,则其 lowerCamelCase 为 lower。对于 lower/UpperCamelCase,应该有一个严格的定义,然后正则表达式就可以自动生成了。 - SWeko
我想匹配像"CamelCase1"和"camelCase2"这样的文本,适用于小驼峰命名法! - Ankit
啊,抱歉。只有在实际存在“驼峰”时,单词才是驼峰式的,因此“lower”和“Upper”不匹配。数字算作驼峰吗?例如,“lower8”,“lower8Upper”,“lower8lower”或“lower8UPPER”是否匹配? - SWeko
我认为可能会有。 - Ankit
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接