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

时间:2009-05-02 22:35:40

标签: regex perl

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

ZshTabCompletionBackward 
MacTerminalIterm

我做了以下正则表达式

[A-Z]{1}[a-z]*[A-Z]{1}[a-z]*

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

ZshTab

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

([A-Z]{1}[a-z]*[A-Z]{1}[a-z]*){1-9}

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

4 个答案:

答案 0 :(得分: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中解释了所有这些功能。

答案 1 :(得分:7)

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

[A-Z][a-zA-Z]*

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

答案 2 :(得分:5)

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

/\b[A-Z][a-zA-Z]*[a-z][a-zA-Z]*\b/

如果您希望排除由单个大写字母后跟任意数量的小写字母组成的单词(例如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/

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

答案 3 :(得分:0)

这个怎么样:/\b[A-Z]([a-z]+[A-Z]?)*\b/ ??