2016-11-14 11 views
0

Мне нужно преобразовать следующий EBNF в регулярное выражение, которое будет соответствовать любой допустимой строке формата. Например '< 8', '*^10', '+ 6', '15, 0,2' и т.д.Преобразование EBNF в регулярное выражение

<spec> -> :[[<fill>]<align>][<sign>][<width>][,][.<prec>] 
<fill> -> <character> (* i.e., any one character) 
<align> -> < | > | = |^
<sign> -> + | - | ' ' 
<width> -> <integer> (* i.e, one or more digits 0....9 *) 
<prec> -> <integer> 
+0

Покажите нам, что вы пробовали – nozzleman

ответ

0

Если движок регулярных выражений поддерживает именованные группы захвата (Fe PCRE), то это может работать :

^((?<fill>.?)(?<align>[<>=^]))?(?<sign>[ +\-]?)(?<width>[0-9]+)[,]?(?:[.](?<prec>[0-9]+))?$ 

Тест here

Обратите внимание, что большинство не является обязательным, для "ширины" захвата группы, за исключением. Это предположение основано на том, что «ширина» существует во всех примерах.

Использования неназванных групп перехвата, регулярное выражение становится короче:

^((.?)([<>=^]))?([ +\-]?)([0-9]+)[,]?(?:[.]([0-9]+))?$ 

 Смежные вопросы

  • Нет связанных вопросов^_^