Что такое '? -mix' в Ruby Regular Expression

Просто пытаюсь отладить регулярное выражение в ruby. Когда я показываю содержимое регулярного выражения, он показывает ?-mix в начале регулярного выражения, даже если эти символы не были частью выражения. См. Следующий вывод IRB, чтобы увидеть это проиллюстрированное

irb(main):028:0* EXPR = /^a$/
=> /^a$/
irb(main):029:0> EXPR
=> /^a$/
irb(main):030:0> puts EXPR
(?-mix:^a$)
=> nil

как вы можете видеть, когда вы используете puts для печати содержимого обычного выражения, в начале есть ?-mix. Должен ли я быть обеспокоен этим? Откуда он?

Ответы

Ответ 1

mix не является английским словом mix, его параметры Regexp.

См. Regexp#to_s:

Возвращает строку, содержащую регулярное выражение и его параметры (с использованием нотации (?opts:source).

В вашем примере m предназначен для многострочного режима, i для нечувствительности к регистру, а x - для расширенного режима. Параметры перед тире включены, после них (по умолчанию). На примере вопроса ?-mix отключены все опции.

Вы можете включить их, например:

puts /^a$/mix
# =>(?mix:^a$)

Ответ 2

Относительно - это синтаксис для флагов. Те, кто находится перед тире, включены, а те, кто выключен,

Как указано в документах Regexp, это встроенный модификатор, используя синтаксис (?on-off):

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

  • /pat/i - Игнорировать случай
  • /pat/m - обрабатывать символ новой строки как символ, сопоставляемый .
  • /pat/x - игнорировать пробелы и комментарии в шаблоне
  • /pat/o - Выполните интерполяцию #{} только один раз

i, m, и x также могут применяться на уровне подвыражения с конструкцией (?on-off), которая включает опции и отключает опции для выражения, заключенного в круглые скобки.

Следовательно, в моем случае это означает, что опции m, i и x выключены и ни одна из них не включена.