O que significa quando uma expressão regular é cercada por @ símbolos?

Questão

O que significa quando uma expressão regular é cercada por @ símbolos? Isso significa algo diferente de ser cercado por barras? E quanto a quando @x ou @i estão no final? Agora que eu penso sobre isso, o que os cortes circundantes significam mesmo?


fundo

Eu vi essa resposta do StackOverflow , publicada por John Kugelman, na qual ele mostra habilidades sérias da Regex.

Agora, estou acostumado a ver regexes cercado por barras como em

/^abc/ 

Mas ele usou uma regex cercada por símbolos @:

 '@ ^% (.{2}) # State, 2 chars ([^^]{0,12}.) # City, 13 chars, delimited by ^ ([^^]{0,34}.) # Name, 35 chars, delimited by ^ ([^^]{0,28}.) # Address, 29 chars, delimited by ^ \?$ @x' 

Na verdade, parece estar no formato:

 @^abc@x 

No processo de tentar ao Google o que isso significa (é uma pergunta difícil para o google!), Eu também vi o formato:

 @^abc@i 

É claro o x e o i não são caracteres correspondentes.

Então o que tudo isso significa???

Agradecemos antecipadamente por todas e quaisquer respostas,

-GMale

As barras circundantes são apenas os delimitadores regex. Você pode usar qualquer personagem (afaik) para fazer isso – o mais comumente usado é o /, outro que eu vi um pouco usado é #

Então, em outras palavras, @whatever@i é essencialmente o mesmo que /whatever/i (i é modificador para uma combinação isenta de maiúsculas e minúsculas)

A razão pela qual você pode querer usar algo diferente do / é se o seu regex contém o personagem. Você evita ter que escaping dele, semelhante ao usar ” for strings instead of “”.

Encontrou isso de um link “relacionado”.

O delimitador pode ser qualquer caractere que não seja alfanumérico, espaço em branco ou um caractere de barra invertida.

/ é o delimitador mais utilizado, uma vez que está intimamente associado aos literais regex, por exemplo, em JavaScript, onde são o único delimitador válido. No entanto, qualquer símbolo pode ser usado.

Eu vi pessoas usar ~ , # , @ , mesmo ! para delimitar suas regexes de uma forma que evite usar símbolos que também estão na regex. Pessoalmente, acho isso ridículo.

Um fato menos conhecido é que você pode usar um par correspondente para delimitar um regex em PHP. Isso tem a enorme vantagem de ter uma diferença óbvia entre o delimitador de fechamento e o símbolo que aparece no padrão e, portanto, não precisa de escaping. Minha preferência pessoal é esta:

 (^abc)i 

Ao usar parênteses, lembro-me que em uma partida, $m[0] é sempre a partida completa, e os subpatrones começam em $m[1] .