Combinando uma barra para frente com um regex

95

Não tenho muita experiência com JavaScript, mas estou tentando criar um sistema de tags que, em vez de usar @ou #, usaria /.

var start = /#/ig; // @ Match

var word = /#(\w+)/ig; //@abc Match

Como eu poderia usar um em /vez do #. Tentei fazer var slash = '/'e adicionar + slash +, mas falhou.

iBrazilian2
fonte
1
Por favor, mude o título. E o que você realmente está tentando fazer? Eu ainda não tenho ideia depois de ler sua pergunta.
OptimusCrime
Eu não tenho certeza se entendi.
John Strickler

Respostas:

128

Você pode escapar assim.

/\//ig; //  Matches /

ou apenas use indexOf

if(str.indexOf("/") > -1)
Ben McCormick
fonte
Obrigado Ben, eu tentei isso também, mas adicionei outro \ no final.
iBrazilian2
22

Você precisa escapar /com um \.

/\//ig // matches /
Djechlin
fonte
6

Se você quiser usar, /você precisa escapar com um\

var word = /\/(\w+)/ig;
Epascarello
fonte
6

Em expressões regulares, "/" é um caractere especial que precisa ser escapado (AKA sinalizado colocando um \ antes dele, negando assim qualquer função especializada que possa servir).

Aqui está o que você precisa:

var word = /\/(\w+)/ig; //   /abc Match

Leia sobre os caracteres especiais RegEx aqui: http://www.regular-expressions.info/characters.html

Kirk H
fonte
18
"/" não é um caractere especial em expressões regulares. No entanto, é um caractere especial em JavaScript que delimita onde a regex começa e termina.
sokkyoku
5

Você também pode contornar o tratamento JS especial da barra, incluindo-a em um grupo de caracteres, assim:

const start = /[/]/g;
"/dev/null".match(start)     // => ["/", "/"]

const word = /[/](\w+)/ig;
"/dev/null".match(word)      // => ["/dev", "/null"]
nupanick
fonte
2
+1, Usar um conjunto de caracteres para evitar o escape torna o RegEx um caractere mais longo, mas vale a pena para legibilidade: /[/]/diferencia visualmente o delimitador final mais claramente do que /\//.
Dem Pilafian
2
/[/]/é mais fácil de ler e funciona, mas, infelizmente, alguns validadores RegEx reportarão "Um delimitador sem escape deve ser escapado com uma barra invertida" mesmo dentro de um grupo de caracteres . Então, voltei para a /\//forma feia .
Dem Pilafian
4

Você pode escapar dele precedendo-o \(tornando-o \/) ou pode usar new RegExp('/')para evitar o escape da regex .

Veja o exemplo em JSFiddle .

'/'.match(/\//)            // matches /
'/'.match(new RegExp('/')  // matches /
David Cavazos
fonte
1

Para mim, eu estava tentando corresponder /em uma data em C #. Eu fiz isso apenas usando (\/):

string pattern = "([0-9])([0-9])?(\/)([0-9])([0-9])?(\/)(\d{4})";
string text = "Start Date: 4/1/2018";

Match m = Regex.Match(text, pattern);

if (m.Success) 
{ 
    Console.WriteLine(match.Groups[0].Value);  // 4/1/2018
}
else
{
    Console.WriteLine("Not Found!");
}

JavaScript também deve ser capaz de usar de forma semelhante (\/).

vapcguy
fonte
Downvoter, gostaria de explicar? Isso funciona e eu provei isso por meio de testes.
vapcguy
1
Acho que foi um acidente, desculpe. Tentei desfazê-lo, mas diz que meu voto está bloqueado, a menos que a resposta seja editada. A única coisa que vejo é que você tem um registro de captura de grupos que parece não estar usando. Alguma razão para que tudo esteja entre parênteses?
Ryan Quinn
1
@RyanQuinn Obrigado pela explicação. Usei parênteses para agrupar as coisas para representar um dígito específico que eu esperava. Ele também parecia exigir que eles estivessem em um site que eu estava usando para testá-lo: regexr.com Eu editei minha postagem (apenas adicionei um espaço no final), então você deve ser capaz de remover o downvote se desejar.
vapcguy
0

Encontrei dois problemas relacionados com o anterior, ao extrair texto delimitado por \e /, e encontrei uma solução que se adequa a ambos, diferente do uso new RegExp, que requer \\\\no início. Essas descobertas estão no Chrome e no IE11.

A expressão regular

/\\(.*)\//g

não funciona. Acho que //é interpretado como o início de um comentário, apesar do caractere de escape. A expressão regular (igualmente válida no meu caso, embora não em geral)

/\b/\\(.*)\/\b/g

também não funciona. Acho que o segundo /termina a expressão regular, apesar do caractere de escape.

O que funciona para mim é representar /como \x2F, que é a representação hexadecimal de /. Acho que é mais eficiente e compreensível do que usar new RegExp, mas é claro que é necessário um comentário para identificar o código hexadecimal.

Ronald Davis
fonte
0

A barra para frente é um caractere especial, portanto, você deve adicionar uma barra invertida antes da barra para que funcione

$patterm = "/[0-9]{2}+(?:-|.|\/)+[a-zA-Z]{3}+(?:-|.|\/)+[0-9]{4}/";

onde / representa a pesquisa por / Desta forma, você

Junaid Lodhi
fonte