Какое регулярное выражение Perl может соответствовать словам CamelCase? - PullRequest
10 голосов
/ 03 мая 2009

Я ищу следующие слова в файлах .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 ]

21 голосов
/ 03 мая 2009

Я думаю, что вы хотите что-то вроде этого, написанное с флагом /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/

Я объясняю все эти функции в Изучение Perl .

7 голосов
/ 03 мая 2009

Если вы не используете регулярное выражение для извлечения, а просто сопоставляете ...

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

Разве это не единственное реальное требование, чтобы все буквы начинались с заглавной буквы?

5 голосов
/ 03 мая 2009

ответы Брайана и Шарта также будут сообщать слова, состоящие полностью из заглавных букв (например, 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 голосов
/ 16 июля 2009

Как насчет этого: /\b[A-Z]([a-z]+[A-Z]?)*\b/ ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...