Escapar de uma barra em uma expressão regular


106

Minha pergunta é simples e é sobre como escapar da expressão regular. Você precisa escapar de uma barra /em uma expressão regular? E como você faria isso?


1
Que implementação de linguagem / expressão regular você usa?
Gumbo de

Curiosamente, eu estava procurando essa pergunta para Javascript. Mas então meu IDE disse que eu estava usando um escape desnecessário. Então myStr.replace(/[/:.-]+/gi, '_')é válido para minha surpresa. Achei que fosse precisar /[\/:.-]+/gi. Não consigo decidir se isso é legal ou confuso.
Turbo de

Respostas:


90

Qual contexto / idioma? Alguns idiomas usam /como delimitador de padrão, então sim, você precisa escapar, dependendo de qual idioma / contexto. Você pode escapar colocando uma barra invertida na frente dele: \/para algumas linguagens (como PHP), você pode usar outros caracteres como delimitador e, portanto, não precisa escapar. Mas AFAIK em todos os idiomas, o único significado especial que /tem é que pode ser o delimitador de padrão designado.


38

Aqui estão algumas opções:

  • Em Perl, você pode escolher delimitadores alternativos. Você não está confinado a m//. Você pode escolher outro, como m{}. Então escapar não é necessário. Na verdade, Damian Conway em "Perl Best Practices" afirma que m{}é o único delimitador alternativo que deve ser usado, e isso é reforçado por Perl :: Critic (no CPAN). Embora você possa se safar usando uma variedade de caracteres delimitadores alternativos //e {}pareça ser o mais claro para decifrar mais tarde. No entanto, se qualquer uma dessas opções resultar em muitos escapes, escolha aquela que melhor se adequar à legibilidade. Exemplos comuns são m(...), m[...]e m!...!.

  • Nos casos em que você não pode ou prefere não usar delimitadores alternativos, pode escapar as barras com uma barra invertida: m/\/[^/]+$/por exemplo (usando um delimitador alternativo que pode se tornar m{/[^/]+$}, o que pode ser mais claro). Escapar da barra com uma barra invertida é comum o suficiente para merecer um nome e uma página da Wikipedia: Síndrome do Palito de Dente Inclinado . Em expressões regulares em que há apenas uma única instância, escapar uma barra pode não subir ao nível de ser considerado um obstáculo à legibilidade, mas se começar a sair do controle e se sua linguagem permitir delimitadores alternativos como o Perl, isso seria ser a solução preferida.


1
Você pode dar um exemplo? Eu tenho isto: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confE estou tendo conflitos com barras.
CMCDragonkai

Observe que você usa um s, não um m, ao fazer uma substituição (também conhecida como substituto) com expressões regulares. perlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... mas provavelmente é melhor: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confporque evita a interpolação de shell.
DavidO

1
Uma alternativa para escapar do /caractere literal é usar a funcionalidade regex para especificar um caractere por sua codificação ASCII, em hex ou octal. Perl aceita a forma octal \57(fonte regular-expressions.info/refcharacters.html )
lukeuser

Na página vinculada por lukeuser (obrigado) também existe a Sequência de Escape \ Q ... \ E. Isso funcionou para mim.
user3012857

11

Use a barra invertida \ou escolha um delimitador diferente, ou seja, em m#.\d#vez de /.\d/ "Em Perl, você pode alterar o delimitador de expressão / regular para quase qualquer outro caractere especial se você precedê-lo com a letra m (para correspondência);"


6

Se o delimitador for /, você precisará escapar.


0

Se você estiver usando C #, não é necessário escapar dele.


Pode ser, mas aqui eles estão usando perl.
Toto

0

Para java, você não precisa.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Se você colocar \ na frente de /. O IDE dirá "Escape de caractere redundante" \ / "no ReGex"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.