Wyrażenie regularne do dopasowania słowa lub jego przedrostka


119

Chcę dopasować wyrażenie regularne do całego słowa.

W poniższym przykładzie Próbuję dopasować salbo seasonale co mam mecze s, e, a, oi n.

[s|season]

Jak dopasować wyrażenie regularne do całego słowa?


4
Użyj (season|s)zamiast tego. [season]dopasowuje dowolny s, e, a, o, n.
falsetru

Odpowiedzi:


137

Nawiasy kwadratowe są przeznaczone dla klasy postaci, a ty rzeczywiście próbując dopasować dowolny z: s, |, s(ponownie) e, a, s(ponownie), oa 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ć.


Tak, zdałem sobie z tego sprawę. Brak nagrywania był tym, czego potrzebowałem. Pomyślałem, że użycie () zawsze będzie pasować, wiedząc, że istnieje opcja niepasowania, jest przydatna. Dziękuję.
NMGod

Nie zrozumiałeś tego. ?:Wewnątrz zgrupowanie aka non-capturingpo prostu mówi, że nie można używać wyrażeń z dopasowane $1, $2i tak dalej ... Jeśli chcesz, że wyrażenie nie pasuje, czego potrzebujesz to ^.
EverythingRightPlace

@ NMGodA1b2c3d4 Nie ma za co! Czy masz na myśli opcję, aby nie dopasować lub złapać (jest różnica, tak). Jeśli nie chcesz dopasować żadnego z nich, użyjesz (?! ... )insead, czyli (?!s|season)w tym przypadku.
Jerry

126

Skorzystaj z tego przykładu na żywo online, aby przetestować swój wzór:

wprowadź opis obrazu tutaj

Powyższy zrzut ekranu pochodzi z tego przykładu na żywo: https://regex101.com/r/cU5lC2/1

Dopasowanie całego słowa w linii poleceń.

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, $content2i $content3ze (\w)+wzorca.

$ content1 i $ content2 zawierają co najmniej jedno słowo, $ content3 nie.

Dopasuj konkretne słowa w linii poleceń bez granic słów

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 gun1i gun2zawierają ciąg dartlub fartktóry jest poprawny, ale gun3 zawiera dartyi nadal pasuje, to jest problem. A więc do następnego przykładu.

Dopasuj określone słowa w linii poleceń do granic słów:

Granice słów można wymusić \b, zobacz: Wizualna analiza tego, co robi wordboundary na stronie jex.im/regulex

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

\bTwierdzi, że mamy granicę słowa, upewniając „dart” jest dopasowany, ale „darty” nie jest.


3
głosowano, ponieważ potrzebowałem znaku \ b, ale o tym nie wiedziałem!
Nieminen

Dlaczego to dokładne wyjaśnienie nie jest odpowiedzią?
dewwwald

1
Ponieważ osoba, która opublikowała pytanie, wybrała pierwszą otrzymaną odpowiedź i nie zawracała sobie głowy przełączaniem się na moją, kiedy moja znacznie lepsza odpowiedź nadeszła później. Możesz poprosić pytającego za pośrednictwem komentarza pod pytaniem, aby zmienił wybór odpowiedzi na tę, co zwiększy wartość tej strony dla osób, które na niej trafią.
Eric Leschinski

1
Głosowałem za mną, ponieważ w swoim przykładzie użyłeś słowa „pierdnięcie” ... i potrzebowałem \ w +;)
Coś.


4

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

2

[ ]definiuje klasę znaków. Więc każda postać, którą tam ustawisz, będzie pasować. [012]będzie pasować 0lub 1lub 2i [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 Anic więcej. Nie ma ucieczki za dolara.

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.