Как я генерирую достойный regex?

Существует ли инструмент там, который взял бы в regex аргументе и выложил бы допустимую комбинацию? Это должно сделать строку, которая соответствует regex.

Например:

  • clear
    • clear
  • ls (-[al]{2}|-a -l|-l -a)
    • ls -al,
    • или ls -a -l
1
задан 30 March 2017 в 10:01

2 ответа

Выберите любой из методов из этого вопроса о переполнении стека, и используйте Python для его выполнения. Например:

$ python -c 'import rstr; print(rstr.xeger("ls (-[al]{2}|-a -l|-l -a)"))'
ls -a -l

Вам может понадобиться установить модуль rstr.

2
ответ дан 7 December 2019 в 13:35

Я не знаю ни одного инструмента, который делает то, что вы хотите из коробки - на самом деле, я был бы удивлен, если бы был - что он должен делать с выражениями, которые содержат подстановочные знаки (например, ). * - например - Вы бы ожидали, что он выведет все возможные символы?)

Вероятно, самым близким было бы какое-нибудь регулярное выражение deparser, которое сгенерировало бы для Вас дерево разбора, которое затем Вам понадобилось бы переходить от корня к листу (при необходимости делая резервную копию, если Вы хотите достичь всех возможных узлов листа). Что-то вроде модуля perl YAPE::Regex, например - на самом деле, Вы могли бы основывать Ваше решение на расширении YAPE::Regex::explain:

$ printf '(-[al]{2}|-a -l|-l -a)' | 
    perl -MYAPE::Regex::Explain -ne 'print YAPE::Regex::Explain->new($_)->explain'
The regular expression:

(?-imsx:(-[al]{2}|-a -l|-l -a))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    -                        '-'
----------------------------------------------------------------------
    [al]{2}                  any character of: 'a', 'l' (2 times)
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    -a -l                    '-a -l'
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    -l -a                    '-l -a'
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

(Я не знаю, почему оно обёртывает выражение в дополнительную (?:...) не захватывающую группу).

К сожалению, модуль, кажется, недоступен из репозиториев Ubuntu, но вы должны иметь возможность установить его через CPAN.

0
ответ дан 7 December 2019 в 13:35

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

Похожие вопросы: