Регулярное выражение, совпадающее с регистром верблюда и паскаля
Я собираюсь написать парсер для языка, который должен иметь строгие синтаксические правила для именования типов, переменных и тому подобного. Например, все классы должны быть 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]*)
Это должно работать для:
- MadeEasy
- Замечательно
- И я
это виды скороговорок.
/([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
Для получения более подробной информации о случаях верблюда и случая паскаля ознакомьтесь с этим репозиторием .