匹配驼峰命名和帕斯卡命名的正则表达式

10
我即将编写一个解析器,用于处理一种对类型、变量等命名有严格语法规则的语言。例如,所有类的命名必须采用PascalCase,而所有变量/参数名称和其他标识符必须采用camelCase。
例如,不允许使用HTMLParser,而应该使用HtmlParser。您有没有任何正则表达式的想法,可以匹配PascalCase格式但其中不包含两个大写字母的内容?

2
我认为最后一句应该是“...但是它里面没有两个连续的大写字母?” - Chris Lutz
4
假设我想要用那种语言编写一个C预处理器,我必须将我的类命名为Cpreprocessor吗?下划线(C_Preprocessor)可以使用吗? - Wayne Conrad
4
“H”是否是一个有效的类名? - Greg Bacon
@Chris,是的,在其中不应该有2个连续的大写字母。C_preprocessor是不允许的,它必须是PreprocessorForC或类似的名称。 - Marcin
7个回答

22

驼峰命名法:

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

PascalCase:

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

由于某些原因,以上两种方法都对我无效。但是以下方法有效:(?:[a-z]+|[A-Z]+|^)([a-z]|\d)*(如果您不想包括数字,请删除|\d)。 - Emile
1
这段代码不能识别单词末尾的大写字母,例如 ModeA。它还不允许连续出现两个大写字母(一般情况下是可以接受的,例如 CreateAMode、CreateBMode)。 - alianos-

4
这是一个正则表达式,用于匹配以下类型的字符串:

^[A-Z][a-z]*([A-Z][a-z]*)

这个模式适用于:

  1. MadeEasy
  2. WonderFul
  3. AndMe

此类模式。


3
/([A-Z][a-z]+)*[A-Z][a-z]*/

但我必须说,你的命名选择很糟糕,HTMLParser应该被允许并优先使用。

+1 给一个正则表达式和一个命名约定的评论,它们看起来非常类似于我要发布的内容,尽管我会将正则表达式简化为 /(?:[A-Z][a-z]+)+/(我认为 OP 不关心是否允许 AaA 作为类名)。 - Chris Lutz
1
是的,我考虑过了,但我觉得AaA没有两个连续的大写字母。这个方案尚未解决的一个更大的问题是数字,它们算作大写、小写、还是都不算? - Roger Pate
它缺少一些细节 - 比如数字,除此之外似乎可以工作。 - Marcin

3

我不认为列出的项可以以数字开头(尽管我在某个地方读到过,所以请谨慎对待),因此最好的情况是像Roger Pate的一样进行一些小修改(在我看来)。

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

应该是这个样子,找一个大写字母,然后至少一个小写字母或数字,或更多,看起来它只处理大写字母,因为这似乎是必需的,但其他字母是可选的。

祝好运


/([A-Z][a-z0-9]+)*[A-Z][a-z0-9]*/.test("HELLO") is true, it requires ^ and $ - kungfooman

1
^[A-Z]{1,2}([a-z]+[A-Z]{0,2})*$

这允许连续两个大写字母(这通常是被接受的,但不幸的是PascalCase不是一个规范)。


0

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


    ^[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

帕斯卡命名法 - 不允许使用数字


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


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

帕斯卡命名法 - 允许数字


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


测试用例:https://regex101.com/library/csrkQw 要了解更多有关驼峰命名法和帕斯卡命名法的详细信息,请查看此repo

0

尽管原帖明确排除两个连续的大写字母,但我想发表一个可以回答许多评论的 PascalCase 的正则表达式:

  • 允许两个连续的大写字母
  • 允许数字(但不能作为字符串的开头字符)
  • 允许以大写字母或数字结尾的字符串

该正则表达式为:^[A-Z][a-z0-9]*(?:[A-Z][a-z0-9]*)*(?:[A-Z]?)$

在对所有评论中提到的所有字符串进行测试时,以下内容匹配为 PascalCase:

PascalCase
Pascal2Case
PascalCaseA
Pascal2CaseA
ModeA
Mode2A
Mode2A2
Mode2A2A
CreateAMode
CreateBMode
MadeEasy
WonderFul
AndMe
Context
HTMLParser
HtmlParser
H
AaA
HELLO

以下不符合 PascalCase 命名规范:

camelCase
2PascalCase

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