Não é possível escapar da barra invertida com regex?

114

Estou usando o seguinte regex

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Eu sei que é feio, mas até agora ele serve a seu propósito diferente de a barra invertida não ser permitida como eu acho que deveria porque escapou, eu também tentei em \\vez de, \\\mas os mesmos resultados. Alguma ideia?

Eton B.
fonte
4
Acabei de corrigir o erro de digitação no título, mas há algo profundamente incrível no título "Não é possível escapar da reação com regex?" De fato!
Adam Crossland
1
@AdamCrossland Não desejamos que o regex nos ajude a escapar da reação? > _>
Eton B.
2
Caramba, eu só queria escapar da reação do regex.
Adam Crossland,

Respostas:

226

Se você estiver colocando isso em uma string dentro de um programa, você pode realmente precisar usar quatro barras invertidas (porque o analisador de string removerá duas delas ao "retirar o escape" dela para a string , e então o regex precisa de duas para um barra invertida regex de escape).

Por exemplo:

regex("\\\\")

é interpretado como ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

é interpretado como ...

regex(\\)

é interpretado como uma regex que corresponde a uma única barra invertida.


Dependendo da linguagem, você pode ser capaz de usar uma forma diferente de citar que não analisa as sequências de escape para evitar ter que usar tantas - por exemplo, em Python:

re.compile(r'\\')

O rna frente das aspas o torna uma string bruta que não analisa escapes de barra invertida.

Âmbar
fonte
14
hehe ... Acabei de encontrar isso e precisava adicionar três. Continuei adicionando barras invertidas até que funcionou.
billynoah
ummm, por que diabos esta regex é reinterpretada duas vezes em vez de uma como deveria ser para PCRE?
Jim Michaels,
3
@JimMichaels porque nem todas as linguagens têm literais regex sem escape e, portanto, às vezes a própria linguagem de programação interpreta escapes de barra uma vez em sua sintaxe de string, e a string resultante é passada para o mecanismo de regex (que interpreta escapes de barra na sintaxe de regex).
Amber
1
uma vez, muito tempo atrás, eu tive que capturar um xpath de um elemento cujo único recurso de identificação era um caminho de arquivo do Windows, então gerar um programa (como uma string) no qual xpaths seriam representados como strings. em um ponto nas etapas intermediárias, havia 8 barras invertidas usadas para representar uma única barra invertida no caminho do arquivo. No entanto, é o mais alto que já consegui.
Zackkenyon
Isso pode se tornar ainda mais complicado ao procurar barras invertidas junto com padrões que requerem metacaracteres. Considere, por exemplo, encontrar uma barra invertida seguida por um dígito. Agora você estaria olhando para a seguinte expressão tentando descobrir o que está acontecendo: new RegExp('\\\\\\d');.
jabacchetta
15

Se não for um literal, você terá que usar \\\\para obter o \\que significa uma barra invertida com escape.

Isso porque existem duas representações. Na representação de string de seu regex, você tem "\\\\", que é o que é enviado para o analisador. O analisador verá o \\que ele interpreta como uma barra invertida de escape válida (que corresponde a uma única barra invertida).

Vivin Paliath
fonte
10

A barra invertida \é o caractere de escape para expressões regulares. Portanto, uma barra invertida dupla realmente significaria uma barra invertida literal única.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html

Brad
fonte
4

De http://www.regular-expressions.info/charclass.html :

Observe que os únicos caracteres especiais ou metacaracteres dentro de uma classe de caracteres são o colchete de fechamento (]), a barra invertida (\\), o circunflexo (^) e o hífen (-). Os metacaracteres usuais são caracteres normais dentro de uma classe de caractere e não precisam ser escapados por uma barra invertida. Para pesquisar uma estrela ou sinal de mais, use [+ *]. Sua regex funcionará bem se você escapar dos metacaracteres regulares dentro de uma classe de caracteres, mas isso reduz significativamente a legibilidade.

Para incluir uma barra invertida como um caractere sem qualquer significado especial dentro de uma classe de caractere, você deve escapar dela com outra barra invertida. [\\ x] corresponde a uma barra invertida ou a um x. O colchete de fechamento (]), o circunflexo (^) e o hífen (-) podem ser incluídos escapando-os com uma barra invertida ou colocando-os em uma posição onde não tenham seu significado especial. Eu recomendo o último método, pois melhora a legibilidade. Para incluir um cursor, coloque-o em qualquer lugar, exceto logo após o colchete de abertura. [x ^] corresponde a um x ou circunflexo. Você pode colocar o colchete de fechamento logo após o colchete de abertura ou o acento circunflexo de negação. [] x] corresponde a um colchete de fechamento ou um x. [^] x] corresponde a qualquer caractere que não seja um colchete de fechamento ou um x. O hífen pode ser incluído logo após o colchete de abertura, ou logo antes do colchete de fechamento, ou logo após o acento circunflexo de negação.

Em que idioma você está escrevendo a regex?

Nate
fonte
0

Esta solução corrigiu meu problema ao substituir a tag br para '\ n'.

alert(content.replace(/<br\/\>/g,'\n'));
hltsydmr
fonte