2009-05-02 95 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/ ??