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.


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)

Dziękuję Ben, ja też próbowałem, ale na koniec dodałem kolejny \.
iBrazilian2



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


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

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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.