#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'] | ''' [''' '#' '[' ']'])*