Відповіді:
Квадратні дужки призначені для класу символів, і ви на самому справі намагаєтеся відповідати будь-якому з: s, |, s(знову ж ), e, a, s(знову ж ), oі n.
Використовуйте дужки замість для групування:
(s|season)
або група, яка не захоплює:
(?:s|season)
Примітка. Групи без захоплення кажуть двигуну, що він не повинен зберігати відповідність, а інший (група захоплення). Що стосується невеликих речей, чи то для роботи, так і для 'важкої роботи', ви можете спершу побачити, чи потрібна вам відповідність чи ні. Якщо цього не зробити, краще скористайтеся групою, яка не захоплює, щоб виділити більше пам'яті для обчислення, а не зберігати щось, що вам ніколи не потрібно буде використовувати.
?:Усередині угруповання ака non-capturingпросто говорить, що ви не можете використовувати збіглися вираження з $1, $2і так далі ... Якщо ви хочете , щоб вираз не відповідає, що вам потрібно ^.
(?! ... )інсад, що означає (?!s|season)в даному випадку.

Наведений вище знімок екрана: цей https://regex101.com/r/cU5lC2/1
Я буду використовувати інтерактивну оболонку phpsh на Ubuntu 12.10, щоб продемонструвати двигун регексу PCRE за допомогою методу, відомого як preg_match
Запустіть phpsh, введіть деякий вміст у змінну, співставляйте слово.
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
Метод preg_match використовував PCRE двигун в мові PHP для аналізу змінних: $content1, $content2і $content3з (\w)+малюнком.
$ content1 та $ content2 містять щонайменше одне слово, $ content3 - ні.
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
Змінні gun1та gun2містять рядок dartабо fartщо є правильним, але gun3 містить dartyі все ще відповідає, це проблема. Тож на наступний приклад.
Межі слів можна примусово співставити \b, див .:

Візуальне зображення Regex, придбане з http://jex.im/regulex та https://github.com/JexCheng/regulex Приклад:
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Стверджує , що ми маємо кордон слова, переконавшись , що «дротик» підібраний, але «Darty» немає.
Я тестую приклади в js. Найпростіше рішення - просто додайте слово u потрібно всередині / /:
var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result
Тепер, якщо вам потрібно це певне слово з межами, а не всередині будь-яких інших знаків-букв. Ми використовуємо маркер b :
var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result
У нас також є метод exec () у js, який повертає об'єкт-результат. Це допомагає fg отримати інформацію про місце / покажчик нашого слова.
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
Якщо нам потрібно отримати всі відповідні слова в рядку / реченні / тексті, ми можемо використовувати g модифікатор (глобальна відповідність):
"cat good cat good cat".match(/\bcat\b/g).length
// 3
Тепер останній - мені потрібно не 1 конкретне слово, а деякі з них. Ми використовуємо | знак, це означає вибір / або.
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]визначає клас символів. Тож кожен персонаж, якого ви там встановите, буде відповідати. [012]буде відповідати 0або 1або 2і [0-2]поводиться так само.
Що ви хочете, це групування, щоб визначити або-заяву. Використовуйте(s|season) для своєї проблеми.
Btw. ви повинні стежити. Метахарактеристики у звичайному регулярному вираженні (або всередині групування) відрізняються від класів символів. Клас символів схожий на підмову. [$A]буде відповідати лише, $або Aнічого іншого. Тут не втече долар.
(season|s)замість цього.[season]відповідає будь-якомуs,e,a,o,n.