Некоторые специальные символы разрешены, только если им предшествует escape-символ

#regex #ocaml #lex #ocamllex

#регулярное выражение #ocaml #лексический #ocamllex

Вопрос:

Я хочу создать регулярное выражение (в стиле lex, с синтаксисом, более похожим на OCaml) для класса строк, где 4 символа [ , ] , # , ' разрешены, только если им предшествует escape-символ ' .

Вот несколько допустимых примеров:

  • '#Data , abc'#Headers , abc'#Totals'[efg , 123'#Totals']efg , abc , 123

Вот несколько недопустимых примеров:

  • #Data , abc#Headers , abc#Totals[efg , 123#Totals]efg , '#Totals[efg

Надеюсь, определение понятно. Во-первых, кто-нибудь знает, как создать такое регулярное выражение? Во-вторых, кто-нибудь знает, как сконструировать такое регулярное выражение (в стиле lex, с синтаксисом, более похожим на OCaml), которое может быть принято ocamllex?

Комментарии:

1. Привет, интересно, возможно, может сработать регулярное выражение, которое ищет необязательный escape-символ, за которым следует что угодно ^[^[]#']*('.*)?$

2. @IronMan Спасибо за ваш комментарий, я протестировал ваше предложение в regextester.com , похоже, что оно считает '#Totals[efg допустимым. Однако для меня '#Totals[efg недопустимо, потому что [ ему не предшествует ' .

3. Возможно, за одним или несколькими не-специальными символами следует необязательная escape-последовательность ^([^[]#']*('[[]#'])*)*$

4. Регулярное выражение lex является ([^][#']|'[][#'])* . (Или измените * на , если вы не разрешаете использование пустых строк.) Но я понимаю, что «более синтаксический подход OCaml-lilke» требует экранирования некоторых из этих символов, по крайней мере, апострофа.

Ответ №1:

Вы не говорите, что принятые строки выглядят иначе, чем в нескольких примерах. Просто для конкретности скажем, что разрешены буквы и цифры нижнего регистра, а 4 специальных символа разрешены, только если им предшествует ' .

Это, таким образом, описывается замыканием Kleene набора из 36 односимвольных строк и 4 двухсимвольных строк.

Который выглядит следующим образом:

  (['a' - 'z' '0' - '9'] | ''' [''' '#' '[' ']'])*