2009-05-02 64 views
10

我在.todo搜索文件下面的话:Perl正则表达式可以匹配CamelCase单词吗?

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中制作上述正则表达式?

回答

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中解释了所有这些功能。

+3

是不是一个大写单词(如Perl或Boing)也是一个有效的CamelCase单词?在这种情况下,量词应该是{1,}或简单地+ – 2009-05-02 23:16:53

+0

@Barry:在许多情况下,它会导致更多的问题而不是解决它们。我喜欢Brians的版本。 @布莱恩:你的上一个命令中没有使用的flag/x是什么意思? – 2009-05-03 00:08:29

+0

Perl或Boing不是骆驼式的,因为它们不是复合词。 – 2009-05-03 00:27:11

7

假设你没有使用正则表达式做提取,只是匹配...

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

是不是唯一的真正的需求,它的所有字母和大写字母开头?

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/ 

(基本上,我们所需要的字符串开始以大写字母和包含至少一种另外的大写字母和一个小写字母;这后两种可以出现在任一次序。 )

0

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