Utf8 правильное регулярное выражение для CamelCase (WikiWord) в Perl - PullRequest
4 голосов
/ 12 июня 2011

Здесь был вопрос о CamelCase regex .С комбинацией tchrist post мне интересно, что является правильным utf-8 CamelCase .

Начиная с (Брайан Д. Фой) регулярное выражение:

/
    \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          # start at word boundary
    \p{Uppercase_Letter}     # start with upper
    \p{Alphabetic}*          # followed by any alpha

    (?:  # non-capturing grouping for alternation precedence
       \p{Lowercase_Letter}[a-zA-Z]*\p{Uppercase_Letter}   ### next bit is lower, any zero or more, ending with upper
          |                  # or 
       \p{Uppercase_Letter}[a-zA-Z]*\p{Lowercase_Letter}   ### next bit is upper, any zero or more, ending with lower
    )

    \p{Alphabetic}*          # anything that's left
    \b          # end at word 
/x

Возникла проблема со строками, помеченными '###'.

Кроме того, как изменить регулярное выражение, предполагая, что числа иподчеркивания эквивалентны строчным буквам, поэтому W2X3 является допустимым словом CamelCase.

Обновлено: (комментарий ysth)

для следующего,

  • any: означает «прописные или строчные буквы или цифры или подчеркивания»

Регулярное выражение должно соответствовать CamelWord, CaW

  • начинаться с заглавной буквы
  • необязательно любое
  • строчная буква или цифра или подчеркивание
  • необязательно любое
  • заглавная буква
  • необязательно любое

Пожалуйста, не отмечайте как дубликат, потому что это не так. оригинальный вопрос (и ответы на него тоже) считаются только ascii.

1 Ответ

5 голосов
/ 12 июня 2011

Я действительно не могу сказать, что вы пытаетесь сделать, но это должно быть ближе к тому, чем, по-видимому, было ваше первоначальное намерение.Я до сих пор не могу сказать, что вы хотите с этим сделать.

m{
    \b
    \p{Upper}      #  start with uppercase code point (NOT LETTER)

    \w*            #  optional ident chars 

    # note that upper and lower are not related to letters
    (?:  \p{Lower} \w* \p{Upper}
      |  \p{Upper} \w* \p{Lower}
    )

    \w*

    \b
}x

Никогда не используйте [a-z].И на самом деле, не используйте \p{Lowercase_Letter} или \p{Ll}, поскольку они не совпадают с более желательными и более правильными \p{Lowercase} и \p{Lower}.

И помните, что \wна самом деле просто псевдоним для

[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Letter_Number}\p{Connector_Punctuation}]
...