Відповіді:
Квадратні дужки призначені для класу символів, і ви на самому справі намагаєтеся відповідати будь-якому з: 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
.