Odpowiedzi:
Nawiasy kwadratowe są przeznaczone dla klasy postaci, a ty rzeczywiście próbując dopasować dowolny z: s
, |
, s
(ponownie) e
, a
, s
(ponownie), o
a n
.
Zamiast tego użyj nawiasów do grupowania:
(s|season)
lub grupa nieobejmująca:
(?:s|season)
Uwaga: grupy bez przechwytywania informują silnik, że nie musi przechowywać dopasowania, podczas gdy druga (grupa przechwytująca tak). W przypadku małych rzeczy albo działa, w przypadku rzeczy „ciężkich” możesz najpierw sprawdzić, czy potrzebujesz dopasowania, czy nie. Jeśli tego nie zrobisz, lepiej użyj grupy bez przechwytywania, aby przydzielić więcej pamięci na obliczenia, zamiast przechowywać coś, czego nigdy nie będziesz musiał używać.
?:
Wewnątrz zgrupowanie aka non-capturing
po prostu mówi, że nie można używać wyrażeń z dopasowane $1
, $2
i tak dalej ... Jeśli chcesz, że wyrażenie nie pasuje, czego potrzebujesz to ^
.
(?! ... )
insead, czyli (?!s|season)
w tym przypadku.
Powyższy zrzut ekranu pochodzi z tego przykładu na żywo: https://regex101.com/r/cU5lC2/1
Będę za pomocą phpsh interaktywną powłokę na Ubuntu 12.10 do wykazania silnik PCRE regex za pomocą metody znanej jako preg_match
Rozpocznij phpsh, umieść zawartość w zmiennej, dopasuj słowo.
el@apollo:~/foo$ phpsh
php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'
php> echo preg_match('(\w+)', $content1);
1
php> echo preg_match('(\w+)', $content2);
1
php> echo preg_match('(\w+)', $content3);
0
Metoda preg_match używany silnik PCRE w języku PHP do analizy zmiennych: $content1
, $content2
i $content3
ze (\w)+
wzorca.
$ content1 i $ content2 zawierają co najmniej jedno słowo, $ content3 nie.
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(dart|fart)', $gun1);
1
php> echo preg_match('(dart|fart)', $gun2);
1
php> echo preg_match('(dart|fart)', $gun3);
1
php> echo preg_match('(dart|fart)', $gun4);
0
Zmienne gun1
i gun2
zawierają ciąg dart
lub fart
który jest poprawny, ale gun3 zawiera darty
i nadal pasuje, to jest problem. A więc do następnego przykładu.
Granice słów można wymusić \b
, zobacz:
Obraz wizualny Regex uzyskany z http://jex.im/regulex i https://github.com/JexCheng/regulex Przykład:
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0
php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0
\b
Twierdzi, że mamy granicę słowa, upewniając „dart” jest dopasowany, ale „darty” nie jest.
Testuję przykłady w js. Najprostsze rozwiązanie - po prostu dodaj słowo, którego potrzebujesz w / /:
var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result
Teraz, jeśli potrzebujesz tego konkretnego słowa z granicami, a nie wewnątrz żadnych innych znaków-liter. Używamy znacznika b :
var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result
W js mamy również metodę exec (), która zwraca wynik-obiektu. Pomaga fg uzyskać informacje o miejscu / indeksie naszego słowa.
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
Jeśli potrzebujemy uzyskać wszystkie dopasowane słowa w ciągu / zdaniu / tekście, możemy użyć modyfikatora g (dopasowanie globalne):
"cat good cat good cat".match(/\bcat\b/g).length
// 3
Teraz ostatnie - nie potrzebuję jednego konkretnego słowa, ale kilka z nich. Używamy | znak, to znaczy wybór / lub.
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]
definiuje klasę znaków. Więc każda postać, którą tam ustawisz, będzie pasować. [012]
będzie pasować 0
lub 1
lub 2
i [0-2]
zachowuje się tak samo.
To, czego chcesz, to grupowanie w celu zdefiniowania instrukcji lub. Użyj (s|season)
dla swojego problemu.
Przy okazji. musisz uważać. Metaznaki w normalnym wyrażeniu regularnym (lub wewnątrz grupy) różnią się od klasy znaków. Klasa postaci jest jak język podrzędny. [$A]
będzie pasować $
lub A
nic więcej. Nie ma ucieczki za dolara.
(season|s)
zamiast tego.[season]
dopasowuje dowolnys
,e
,a
,o
,n
.