PascalCased单词的正则表达式(又称具有首字母大写的camelCased)

50

如何使用正则表达式在文档中查找所有 PascalCase 单词?

如果您不知道 Pascal case 的含义,我只关心前导大写驼峰命名(即首字母大写的驼峰命名单词)。


3
我想指出你描述的是PascalCase。CamelCase特指第一个单词首字母小写,后面所有单词首字母大写的格式。 - Jens Bodal
绝对是PascalCase这是camelCase - Jacob
9个回答

75
([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]*

它匹配以大写字母开头,只包含字母和数字,并且至少包含一个小写字母和至少一个其他大写字母的字符串。


1
具有子序列大写字符或以大写字符结尾的单词怎么办? - ephemient
2
如果你想匹配只有两个或以上大写字母的单词,可以使用以下正则表达式:([A-Z][a-z0-9]*){2,} - Adam Crume
1
没错,但这也匹配所有大写单词,而这些(在我看来)不应被视为驼峰命名法。 - ephemient
2
好的,那么:A-Z[A-Za-z0-9]* 可以匹配由大写字母开头,仅包含字母和数字,并且至少包含一个小写字母和至少一个其他大写字母的字符串。 - Adam Crume

20

小驼峰命名法

该正则表达式包含数字,并实现了Google Java编码规范定义的严格小驼峰命名法的正则表达式验证。

[a-z]+((\d)|([A-Z0-9][a-z0-9]+))*([A-Z])?
  1. 第一个字符为小写字母。
  2. 其后的元素可以是单个数字或者由一个大写字母和小写字母组成的字符串。
  3. 最后一个字符可以是大写字母。

这是一个展示该正则表达式的代码片段。以下元素是合法的。

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

1
大驼峰正则表达式允许以数字开头的字符串。 - HosseinAgha
1
@HosseinAgha,我进行了更新以排除学习数字,感谢您的反馈。 - Nicolas Henneaux

6

解决我的问题的正则表达式(用于正确命名将被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

5

Adam Crume的正则表达式接近正确,但无法匹配例如IFooHTTPConnection。其他情况不确定,但可以尝试使用以下正则表达式:

\b[A-Z][a-z]*([A-Z][a-z]*)*\b

与Adam的答案相同,关于数字、I18N、下划线等方面需要注意。
你可以在这里进行测试:链接

1
问题在于这个程序也会将 Class 识别为驼峰命名单词。 - Whitecat

2
这似乎可以做到:
/^[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的更好,而且它通过了我编写的所有测试。 - nakajima

1

刚刚修改了@AdamCrume的一个提议:

([A-Z]+[a-z0-9]+)+

这将匹配 IFrame,但不匹配 ABC。其他驼峰命名的单词会被匹配,例如 AbcDoesWork,最重要的是,它还可以匹配没有至少一个大写字母的简单单词,例如 Frame
你认为这个版本怎么样?我是否漏掉了一些重要情况?

1
([A-Z][a-z\d]+)+
对于大驼峰命名法来说,这应该能解决问题。如果你还想考虑类似 _IsRunning 这样的情况,也可以在前面加上下划线。

0

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


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


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

帕斯卡命名法 - 允许数字


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

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

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

支持2-3个字母大写缩写,例如IOStreamStreamIODeviceIDdeviceIDAwsVPCawsVPCserialNOSerialNOdeviceSNDeviceSN。这种变体受到了微软的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})$


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

0

([a-z0-9]+|[A-Z0-9]+[a-z0-9]*|[A-Z0-9][a-z0-9]*([A-Z0-9][a-z0-9]*)*)

Java正则表达式匹配驼峰命名字符串。


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