匹配骆驼和帕斯卡案例的正则表达式
Posted
技术标签:
【中文标题】匹配骆驼和帕斯卡案例的正则表达式【英文标题】:Regex that matches Camel and Pascal Case 【发布时间】:2011-01-07 09:32:27 【问题描述】:我即将为一种语言编写一个解析器,该语言应该对类型、变量等的命名有严格的句法规则。例如,所有类必须为 PascalCase,所有变量/参数名称和其他标识符必须为 camelCase。
例如,htmlParser
是不允许的,必须命名为 HtmlParser
。任何可以匹配 PascalCase 但其中没有两个大写字母的正则表达式的想法?
【问题讨论】:
我认为最后一句应该是“...但是里面没有两个连续的大写字母?” 假设我想用那种语言编写一个 C 预处理器。我必须命名我的类 Cpreprocessor 吗?是否允许使用下划线(C_Preprocessor)?H
是一个有效的类名吗?
@Chris 是的,它不应该有 2 个连续的大写字母。不允许使用 C_preprocessor,它必须是 PreprocessorForC 或类似的东西。
【参考方案1】:
驼峰式:
^[a-z]+(?:[A-Z][a-z]+)*$
PascalCase:
^[A-Z][a-z]+(?:[A-Z][a-z]+)*$
【讨论】:
由于某种原因,上述方法都不适合我。但是,以下是 (?:[a-z]+|[A-Z]+|^)([a-z]|\d)* (如果您不想包含数字,请删除 |\d。【参考方案2】:/([A-Z][a-z]+)*[A-Z][a-z]*/
但我不得不说你的命名选择很糟糕,应该允许和首选 HTMLParser。
【讨论】:
+1 表示正则表达式和对命名约定的评论,两者看起来都与我要发布的内容可疑地相似,但我会将正则表达式简化为/(?:[A-Z][a-z]+)+/
(我不认为OP 关注的是允许AaA
作为类名)。
是的,我考虑过,但认为 AaA 没有两个连续的大写字母。该方案尚未解决的一个更大的问题是数字,它们是算作上、下还是两者都算?
它缺少一些细节——比如数字,但它似乎可以工作。【参考方案3】:
^[A-Z][a-z]*([A-Z][a-z]*)
这应该适用于:
-
轻松搞定
太棒了
和我
这种类型的模式。
【讨论】:
【参考方案4】:我不相信列出的项目可以以数字开头(我认为我在某处读过它,所以请谨慎对待)所以最好的情况是像 Roger Pate 的一些小修改(在我看来)
/^([A-Z][a-z0-9]+)*[A-Z][a-z0-9]*$/
应该是这样的,寻找一个大写字母,然后是至少一个小写字母或数字,或者更多,而且看起来它只处理一个大写字母,因为这似乎是必需的,但额外的字母是可选。
祝你好运
【讨论】:
/([A-Z][a-z0-9]+)*[A-Z][a-z0-9]*/.test("HELLO")
是true
,它需要^
和$
以上是关于匹配骆驼和帕斯卡案例的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章