Инспекция '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
все будет без учета регистра.