Инспекция 'Regexp.union'

Regexp.union возвращает следующую проверку:

Regexp.union(/dogs/, /cats/i) #=> /(?-mix:dogs)|(?i-mx:cats)/

Что значит ?-mix: имею в виду?

2 ответа

Решение

То, что вы видите, это представление опций в под Регулярных выражениях. Параметры слева от дефиса включены, а параметры справа от дефиса отключены. Целесообразно явно включить или отключить каждый параметр, чтобы обеспечить правильное поведение, если это регулярное выражение когда-либо станет частью более крупного.

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

Смотрите документацию по Ruby на опциях регулярных выражений:

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

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

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

Это переключатели флагов внутри регулярного выражения. /cats/i означает "использовать флаг i по всему регулярному выражению ". Вы можете включать и выключать флаги внутри регулярного выражения, поэтому приведенное выше эквивалентно /(?i:cats)/, Есть два других флага, которыми можно манипулировать таким образом: m а также x, Поскольку по умолчанию все флаги отключены, если не указано иное, это эквивалентно /(?i-mx:cats)/ ("включить i и отключить m а также x внутри регулярного выражения cats").

Когда вы комбинируете регулярные выражения, они явно отключают отключенные флаги, чтобы они не наследовали их из внешнего контекста. Например:

tiny = /tiny/             # case sensitive
tina = /#{tiny} tina/i    # case insensitive
# => /(?-mix:tiny) tina/i

Это будет соответствовать "tiny tina" или же "tiny Tina", но нет "Tiny Tina", Если встроенное регулярное выражение для tiny явно не отключал чувствительность к регистру, а просто уступил /tiny tina/iвсе будет без учета регистра.

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