Преобразовать правила 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, но, опять же, это только из-за характера этого конкретного случая - перевод не является автоматически действительным.

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

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