Преобразовать правила ABNF в регулярные выражения
Пожалуйста, помогите мне понять это правило ABNF ([a-z]* [A-Z]* [0-9]*)*
,
Я думаю, что это может быть преобразовано в регулярное выражение, как это [a-zA-Z0-9]*
, Таким образом, правило ABNF должно соответствовать строчным и / или прописным буквам и / или цифрам в любом порядке и их комбинациям. Например, ниже строки должны соответствовать правилу.
"ABC", "abc", "abc12", "aAbC876", "123go", etc.
И если правило ABNF ([a-z]* [A-Z]* | [0-9]*)*
, он также может быть преобразован в то же регулярное выражение.
Проверить регулярные выражения легко, но есть ли инструмент или что-то, что может подтвердить мое понимание этих правил ABNF, или кто-нибудь может подтвердить или исправить меня, пожалуйста?
2 ответа
Спецификации Интернета часто должны определять синтаксис формата. Дополненная форма Бэкуса-Наура (ABNF) является модифицированной версией Backus-Naur Form
(часто используется для описания синтаксиса языков, используемых в вычислительной технике) и был популярен среди многих из этих спецификаций для уравновешивания компактности и простоты.
ABNF имеет определенный набор основных правил среди стандартных BNF.
Ваше правило:
([a-z]* [A-Z]* [0-9]*)*
Объяснение как правило ABNF:
( ) Elements enclosed in parentheses are treated as a
single element whose contents are strictly ordered.
[ ] Square brackets enclose an optional element sequence
a-z A-Z Core rule for a ALPHA character
0-9 Core rule for a DIGIT character
* Repeat (Repetition rule)
Ваше правило, переведенное в расширенное регулярное выражение, будет почти таким же.
([a-z]*[A-Z]*[0-9]*)*
Объяснение:
( group and capture to \1 (0 or more times)
[a-z]* any character of: 'a' to 'z' (0 or more times)
[A-Z]* any character of: 'A' to 'Z' (0 or more times)
[0-9]* any character of: '0' to '9' (0 or more times)
)* end of \1
Правила ABNF аналогичны базовым регулярным выражениям и включают правила именования, повторения, альтернативы, независимость от порядка и диапазоны.
Прямой перевод правила ABNF, которое вы цитируете:
([a-z]* [A-Z]* [0-9]*)*
было бы ERE (Расширенное Регулярное Выражение) как это, которое пропускает пробелы:
([a-z]*[A-Z]*[0-9]*)*
Оба означают "ноль или более повторов: последовательность из нуля или более букв нижнего регистра, за которыми следуют ноль или более букв верхнего регистра, за которыми следуют ноль или более цифр".
Из-за характера терминов вы можете упростить (в данном случае, но в целом требуется осторожность) следующее:
[a-zA-Z0-9]*
Ваше альтернативное правило ABNF также может быть переведено в те же ERE, но, опять же, это только из-за характера этого конкретного случая - перевод не является автоматически действительным.
Я предполагаю, что двойные кавычки и запятые в вашем примере вывода не являются частями строк, которые должны быть сопоставлены.