Dopasowywanie ukośnika do przodu z wyrażeniem regularnym

90

Nie mam dużego doświadczenia z JavaScript, ale próbuję stworzyć system tagów, który zamiast używać @lub #, używałby /.

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

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

Jak mogę użyć /zamiast #. Próbowałem robić var slash = '/'i dodawać + slash +, ale to się nie udało.

iBrazilian2
źródło
1
Zmień tytuł. A co tak naprawdę próbujesz zrobić? Po przeczytaniu twojego pytania nadal nie mam pojęcia.
OptimusCrime
Nie jestem pewien, czy rozumiem.
John Strickler

Odpowiedzi:

123

Możesz uciec od tego w ten sposób.

/\//ig; //  Matches /

lub po prostu użyj indexOf

if(str.indexOf("/") > -1)
Ben McCormick
źródło
Dziękuję Ben, ja też próbowałem, ale na koniec dodałem kolejny \.
iBrazilian2
21

Musisz uciec /z \.

/\//ig // matches /
djechlin
źródło
6

Jeśli chcesz użyć /, musisz uciec z rozszerzeniem\

var word = /\/(\w+)/ig;
epascarello
źródło
6

W wyrażeniach regularnych „/” jest znakiem specjalnym, który musi zostać zmieniony (AKA oflagowany przez umieszczenie przed nim \, co neguje jakąkolwiek wyspecjalizowaną funkcję, którą może służyć).

Oto, czego potrzebujesz:

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

Przeczytaj więcej o znakach specjalnych RegEx tutaj: http://www.regular-expressions.info/characters.html

Kirk H.
źródło
17
„/” nie jest znakiem specjalnym w wyrażeniach regularnych. Jest to jednak znak specjalny w JavaScript, który określa, gdzie zaczyna się i kończy wyrażenie regularne.
sokkyoku
5

Możesz także obejść specjalną obsługę ukośnika w JS, umieszczając go w grupie znaków, na przykład:

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

const word = /[/](\w+)/ig;
"/dev/null".match(word)      // => ["/dev", "/null"]
nupanick
źródło
2
+1, Użycie zestawu znaków w celu uniknięcia zmiany znaczenia sprawia, że ​​wyrażenie RegEx jest o jeden znak dłuższe, ale jest tego warte dla czytelności: /[/]/wizualnie odróżnia końcowy separator wyraźniej niż /\//.
Dem Pilafian
2
/[/]/jest łatwiejszy do odczytania i działa, ale niestety, niektóre walidatory wyrażeń regularnych zgłaszają, że „separator bez znaku zmiany znaczenia musi być poprzedzony ukośnikiem odwrotnym” nawet w obrębie grupy znaków . Więc wróciłem do brzydkiej /\//formy.
Dem Pilafian,
1

Dla mnie próbowałem dopasować /datę w języku C #. Zrobiłem to po prostu używając (\/):

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 powinien również mieć możliwość podobnego użycia (\/).

vapcguy
źródło
Downvoter, chcesz wyjaśnić? To działa i udowodniłem to poprzez testy.
vapcguy
1
Myślę, że to był wypadek, przepraszam. Próbowałem to cofnąć, ale mówi, że mój głos jest zablokowany, chyba że odpowiedź zostanie zmieniona. Widzę tylko, że masz dziennik przechwytywania grup, których nie używasz. Czy jest jakiś powód, dla którego wszystko jest w nawiasach?
Ryan Quinn
1
@RyanQuinn Dzięki za wyjaśnienie. Użyłem nawiasów, aby pogrupować elementy, aby przedstawić określoną cyfrę, której się spodziewałem. Wydawało się, że wymagają ich również w witrynie, której używałem do testowania: regexr.com Edytowałem swój post (po prostu dodałem spację na końcu), więc jeśli chcesz, powinieneś być w stanie usunąć głos przeciwny.
vapcguy
0

Napotkałem dwa problemy związane z powyższym podczas wyodrębniania tekstu ograniczonego przez \i /i znalazłem rozwiązanie, które pasuje do obu, inne niż użycie new RegExp, które wymaga \\\\na początku. Te wyniki są w Chrome i IE11.

Wyrażenie regularne

/\\(.*)\//g

nie działa. Myślę, że //jest to interpretowane jako początek komentarza pomimo postaci ucieczki. Wyrażenie regularne (równie ważne w moim przypadku, ale nie ogólnie)

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

też nie działa. Myślę, że /mimo znaku ucieczki, druga kończy wyrażenie regularne.

To, co działa dla mnie, to reprezentowanie /jako \x2F, co jest reprezentacją szesnastkową /. Myślę, że jest to bardziej wydajne i zrozumiałe niż używanie new RegExp, ale oczywiście wymaga komentarza, aby zidentyfikować kod szesnastkowy.

Ronald Davis
źródło
0

Ukośnik w przód to znak specjalny, więc musisz dodać ukośnik odwrotny przed ukośnikiem, aby działał

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

gdzie / reprezentuje wyszukiwanie / W ten sposób Ty

Junaid Lodhi
źródło