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.


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)

Obrigado Ben, eu tentei isso também, mas adicionei outro \ no final.
iBrazilian2

22

Você precisa escapar /com um \.

/\//ig // matches /

6

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

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

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


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"]

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


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 (\/).


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.


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ê

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.