Perl正则表达式可以匹配CamelCase单词?

Léo*_* 준영 10 regex perl

我在.todo文件中搜索以下单词:

ZshTabCompletionBackward 
MacTerminalIterm
Run Code Online (Sandbox Code Playgroud)

我做了以下正则表达式

[A-Z]{1}[a-z]*[A-Z]{1}[a-z]*
Run Code Online (Sandbox Code Playgroud)

但是,这还不够,因为它只找到以下类型的单词

ZshTab
Run Code Online (Sandbox Code Playgroud)

在伪代码中,我试图制作以下正则表达式

([A-Z]{1}[a-z]*[A-Z]{1}[a-z]*){1-9}
Run Code Online (Sandbox Code Playgroud)

你如何在Perl中制作上述正则表达式?

bri*_*foy 21

我想你想要这样的东西,用/x旗帜写下来添加评论和无关紧要的空白:

/
   \b      # word boundary so you don't start in the middle of a word

   (          # open grouping
      [A-Z]      # initial uppercase
      [a-z]*     # any number of lowercase letters
   )          # end grouping

   {2,}    # quantifier: at least 2 instances, unbounded max  

   \b      # word boundary
/x

如果你想要它没有花哨的格式,只需删除空格和注释:

/\b([A-Z][a-z]*){2,}\b/

正如j_random_hacker指出的那样,这有点简单,因为它将匹配一个只是连续大写字母的单词.他的解决方案,我已经扩展/x以显示一些细节,确保至少一个小写字母:

/
    \b          # start at word boundary
    [A-Z]       # start with upper
    [a-zA-Z]*   # followed by any alpha

    (?:  # non-capturing grouping for alternation precedence
       [a-z][a-zA-Z]*[A-Z]   # next bit is lower, any zero or more, ending with upper
          |                     # or 
       [A-Z][a-zA-Z]*[a-z]   # next bit is upper, any zero or more, ending with lower
    )

    [a-zA-Z]*   # anything that's left
    \b          # end at word 
/x

如果你想要它没有花哨的格式,只需删除空格和注释:

/\b[A-Z][a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/

我在Learning Perl中解释了所有这些功能.

  • 不是单个大写单词(如Perl或Boing)也是有效的CamelCase单词吗?在这种情况下,量词应为{1,}或简单+ (3认同)
  • 当你谈论骆驼的事情时,你们需要更加小心:你的意思是ArabianCamelCase(也称为DromedaryCase,一个字还可以)或BactrianCamelCase(多个单词)? (2认同)
  • 第三种形式 smallFirstLetter 大小写怎么样?那不也是骆驼套吗?毕竟,不管是什么样的骆驼,驼峰总是在中间,而不是在两端。 (2认同)
  • 请注意,此正则表达式还将拾取由所有大写字母组成的单词(取决于您对驼峰大小写的精确定义,这些单词可能会或可能不会被视为驼峰大小写).如果你想限制只包含至少一个小写字母的骆驼套接字,请使用:/\b([AZ] [az]*)+ [AZ] [az] +([AZ] [az]*)*\b / (2认同)

Bil*_*nch 7

假设您没有使用正则表达式进行提取,只是匹配...

[A-Z][a-zA-Z]*
Run Code Online (Sandbox Code Playgroud)

这不是唯一真正要求它是所有字母并以大写字母开头吗?

  • 除了不那么复杂之外,这几乎等同于Brian的正则表达式.你可以检测到像HellotheRe这样的单词,这显然是不正确的CamelCase,但没有正则表达式可以告诉你那里的单词是什么.只要加上边界标记,这应该足够好了. (2认同)

j_r*_*ker 5

brian'ssharth的答案也将报告完全由大写字母组成的单词(例如FOO).这可能是也可能不是你想要的.如果您想限制只包含至少一个小写字母的驼峰式单词,请使用:

/\b[A-Z][a-zA-Z]*[a-z][a-zA-Z]*\b/
Run Code Online (Sandbox Code Playgroud)

如果您希望排除由单个大写字母后跟任意数量的小写字母组成的单词(例如Perl),请使用:

/\b[A-Z][a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/
Run Code Online (Sandbox Code Playgroud)

(基本上,我们要求字符串以大写字母开头并包含至少一个额外的大写字母和一个小写字母;后两个字母可以按任意顺序出现.)