Регулярное выражение, совпадающее с регистром верблюда и паскаля

Я собираюсь написать парсер для языка, который должен иметь строгие синтаксические правила для именования типов, переменных и тому подобного. Например, все классы должны быть PascalCase, а все имена переменных / параметров и другие идентификаторы должны быть camelCase.

Например HTMLParser не допускается и должен быть назван HtmlParser, Любые идеи для регулярного выражения, которые могут соответствовать чему-то, что является PascalCase, но не имеет двух заглавных букв в нем?

7 ответов

Решение

верблюжий:

^[a-z]+(?:[A-Z][a-z]+)*$

PascalCase:

^[A-Z][a-z]+(?:[A-Z][a-z]+)*$

^[A-Z][a-z]*([A-Z][a-z]*)

Это должно работать для:

  1. MadeEasy
  2. Замечательно
  3. И я

это виды скороговорок.

/([A-Z][a-z]+)*[A-Z][a-z]*/

Но я должен сказать, что ваш выбор имен воняет, HTMLParser должен быть разрешен и предпочтен.

Я не верю, что перечисленные элементы могут начинаться с цифр (подумал, что я где-то читал, так что возьмите их с крошкой соли), поэтому лучшим вариантом будет что-то вроде Роджера Пейта с несколькими незначительными изменениями (на мой взгляд)

/([A-Z][a-z0-9]+)*[A-Z][a-z0-9]*/

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

Удачи

      ^[A-Z]{1,2}([a-z]+[A-Z]{0,2})*$

Это позволяет использовать 2 последовательных заглавных символа (что общепринято, но, к сожалению, PascalCase не является спецификацией).

Хотя исходное сообщение специально исключало две последовательные заглавные (верхние) буквы, я хотел бы опубликовать регулярное выражение дляPascalCaseкоторый ответит на многие комментарии:

  • Разрешение двух последовательных заглавных букв
  • Разрешение цифр (но не в качестве ведущего символа в строке)
  • Разрешение строки, заканчивающейся заглавной буквой или цифрой

Регулярное выражение^[A-Z][a-z0-9]*(?:[A-Z][a-z0-9]*)*(?:[A-Z]?)$

При проверке всех строк, поднятых во всех комментариях, следующее соответствует PascalCase:

      PascalCase
Pascal2Case
PascalCaseA
Pascal2CaseA
ModeA
Mode2A
Mode2A2
Mode2A2A
CreateAMode
CreateBMode
MadeEasy
WonderFul
AndMe
Context
HTMLParser
HtmlParser
H
AaA
HELLO

Следующее не соответствует PascalCase:

      camelCase
2PascalCase

Нижний верблюжий регистр — цифры не допускаются

      
    ^[a-z][a-z]*(([A-Z][a-z]+)*[A-Z]?|([a-z]+[A-Z])*|[A-Z])$
    

Тестовые случаи: https://regex101.com/library/4h7A1I

Нижний верблюжий регистр — разрешены цифры

      
    ^[a-z][a-z0-9]*(([A-Z][a-z0-9]+)*[A-Z]?|([a-z0-9]+[A-Z])*|[A-Z])$

Тестовые случаи: https://regex101.com/library/8nQras

Pascal Case - цифры не допускаются

      
    ^[A-Z](([a-z]+[A-Z]?)*)$

Тестовые случаи: https://regex101.com/library/sF2jRZ

Pascal Case - разрешены цифры

      
    ^[A-Z](([a-z0-9]+[A-Z]?)*)$

Тестовые случаи: https://regex101.com/library/csrkQw

Для получения более подробной информации о случаях верблюда и случая паскаля ознакомьтесь с этим репозиторием .

Другие вопросы по тегам