Modifiers

Muitas engines suportam modos que alteram a maneira como as expressões regulares são interpretadas ou aplicadas. Vou falar de alguns deles nesse tutorial e também dos modifiers, que são usados para ativar modos.

No Regex 101, se você quiser adicionar ou remover modifiers, você precisará desmarcar a opção correspondente ao modifier que você quer adicionar ou remover. Assim, mesmo se você quiser ativar ou desativar modos digitando ou apagando modifiers, você não conseguirá. Isso não pode ser feito porque o Regex 101 é uma ferramenta que tem uma interface gráfica e preferiu fazer as coisas dessa forma.

Em linguagens de programação, você modifica a expressão regular livremente, incluindo a parte dos modifiers. Os modifiers são informados após a expressão regular em si. Ex: /[abc]/gi (casa com as letras a, b e c minúsculas ou maiúsculas). Como você pode ver, é possível combinar vários modifiers colocando um após o outro, sem nenhum tipo de separador. O último exemplo usou os modifiers g e i.

Veja abaixo os modos mais comuns:

global
Esse modo faz com que a expressão regular não retorne depois do primeiro match, ou seja, da primeira string com a qual ela casar. Então, ela continua sendo interpretada até o fim da string de teste. No Regex 101, esse modo está ativado por padrão. Ele geralmente é ativado com o modifier /g.
case-insensitive
Esse modo faz com que a expressão regular deixe de diferenciar letras maiúsculas e minúsculas. O padrão é case-sensitive, onde essas letras são diferenciadas. Para ativar esse modo, é usado um modifier que geralmente é escrito dessa forma: /i.
multi-line
Faz com que as âncoras ^ e $ passem a casar com o início e fim da linha, ao invés do início e fim da string. O modifier que ativa esse modo é o /m.
single-line
Simbolizado pelo modifier /s, faz com que o metacaractere ponto case também com a quebra de linha. Ele não é suportado por algumas engines, como a do Javascript. Cuidado: não pense que os modos multi-line e single-line não podem ser usados juntos. Eles podem ser usados juntos sem problemas, até porque o alvo do efeito que eles causam é diferente: enquanto o multi-line afeta âncoras, o single-line afeta o metacaractere ponto.

Outra forma de especificar os modifiers aceita por algumas engines é colocá-los dessa forma: (?ab...), sendo a e b os modifiers. Diferentemente da maneira anterior de especificar os modifiers, que era colocá-los no final da expressão regular, nessa forma os modifiers devem ser especificados no início ou no meio da expressão regular. Modifiers especificados dessa forma se aplicam apenas à parte da expressão regular que estiver à direita deles. Exemplo: t(?i)Em (casa com tEM, tEm, teM e tem).

Também é possível desligar modos precedendo os modifiers com um hífen. Exemplos: (?i)a(?-i)bacate (casa com Abacate e abacate), (?i)a(?s-i)bacate.*(igual ao exemplo anterior, só que com o adicional de que vai até o fim da string, porque o ponto passa a casar com quebras de linha também devido ao modo single-line. Perceba que é possível ativar alguns modifiers e desativar outros ao mesmo tempo).

Também é possível usar modifiers spans, que são úteis quando você começa a ligar e desligar o mesmo modifier várias vezes em uma expressão regular. Observe a seguinte expressão regular: (?i)o (?-i)PHP(?i) suporta regex. Veja que o modo case-insensitive é ligado, depois desligado e depois ligado novamente.

O último exemplo poderia ser reescrito da seguinte forma usando modifiers spans: (?i)o (?-i:PHP) suporta regex. O modifier span faz com que os modifiers que ele liga/desliga valham apenas para a subexpressão que é especificada após os dois pontos. Dessa forma, nesse exemplo, toda a expressão regular tem o modo case-insensitive ligado, exceto a subexpressão PHP.

Há ainda casos, em algumas linguagens de programação, em que alguns modos, como o case-insensitive, são ativados através de flags passadas como argumentos para funções.