Abbinamento di una barra in avanti con una regex


95

Non ho molta esperienza con JavaScript ma sto cercando di creare un sistema di tag che, invece di usare @o #, userei /.

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

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

Come potrei usare un /invece di #. Ho provato a fare var slash = '/'e ad aggiungere + slash +, ma non è riuscito.


1
Si prega di modificare il titolo. E cosa stai davvero cercando di fare? Non ho ancora idea dopo aver letto la tua domanda.
OptimusCrime

Non sono sicuro di capire.
John Strickler

Risposte:


128

Puoi scappare in questo modo.

/\//ig; //  Matches /

o usa semplicemente indexOf

if(str.indexOf("/") > -1)

Grazie Ben, ho provato anche quello ma ne ho aggiunto un altro \ alla fine.
iBrazilian2



6

Nelle espressioni regolari, "/" è un carattere speciale che deve essere preceduto da caratteri di escape (AKA contrassegnato inserendo un \ prima di negare così qualsiasi funzione specializzata che potrebbe servire).

Ecco cosa ti serve:

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

Leggi i caratteri speciali RegEx qui: http://www.regular-expressions.info/characters.html


18
"/" non è un carattere speciale nelle espressioni regolari. Tuttavia è un carattere speciale in JavaScript che delimita il punto in cui inizia e finisce la regex.
sokkyoku

5

Puoi anche aggirare la speciale gestione JS della barra in avanti racchiudendola in un gruppo di caratteri, in questo modo:

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

const word = /[/](\w+)/ig;
"/dev/null".match(word)      // => ["/dev", "/null"]

2
+1, L'uso di un set di caratteri per evitare l'escape rende la RegEx più lunga di un carattere, ma ne vale la pena per la leggibilità: /[/]/differenzia visivamente il delimitatore finale più chiaramente di /\//.
Dem Pilafian

2
/[/]/è più facile da leggere e funziona, ma sfortunatamente alcuni validatori RegEx riporteranno "Un delimitatore senza caratteri di escape deve essere preceduto da una barra rovesciata" anche all'interno di un gruppo di caratteri . Quindi, sono tornato alla /\//forma brutta .
Dem Pilafian


1

Per me, stavo cercando di abbinare il /in una data in C #. L'ho fatto semplicemente 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 dovrebbe anche essere in grado di utilizzare in modo simile (\/).


Downvoter, ti va di spiegare? Funziona e l'ho dimostrato testandolo.
vapcguy

1
Penso sia stato un incidente, scusa. Ho provato ad annullarlo, ma dice che il mio voto è bloccato a meno che la risposta non venga modificata. L'unica cosa che vedo è che hai un registro di acquisizione di gruppi che non sembra utilizzare. Qualche motivo per cui tutto è tra parentesi?
Ryan Quinn

1
@ RyanQuinn Grazie per la spiegazione. Ho usato parentesi per raggruppare le cose insieme per rappresentare una cifra particolare che mi aspettavo. Sembrava anche richiederli su un sito che stavo usando per provarlo: regexr.com Ho modificato il mio post (ho appena aggiunto uno spazio alla fine), quindi dovresti essere in grado di rimuovere il downvote se lo desideri.
vapcguy

0

Ho riscontrato due problemi relativi a quanto sopra, durante l'estrazione del testo delimitato da \e /, e ho trovato una soluzione che si adatta a entrambi, oltre all'utilizzo new RegExp, che richiede\\\\ all'inizio. Questi risultati sono in Chrome e IE11.

L'espressione regolare

/\\(.*)\//g

non funziona. Penso che //sia interpretato come l'inizio di un commento nonostante il carattere di fuga. L'espressione regolare (ugualmente valida nel mio caso ma non in generale)

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

non funziona neanche. Penso che il secondo /termini l'espressione regolare nonostante il carattere di fuga.

Quello che funziona per me è rappresentare /come \x2F, che è la rappresentazione esadecimale di /. Penso che sia più efficiente e comprensibile rispetto all'utilizzo new RegExp, ma ovviamente ha bisogno di un commento per identificare il codice esadecimale.


0

Forward Slash è un carattere speciale, quindi devi aggiungere un backslash prima di quello in avanti per farlo funzionare

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

dove / rappresenta la ricerca di / In questo modo tu

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.