Ответы:
Квадратные скобки предназначены для класса символов, и вы на самом деле пытаетесь соответствовать любому из: 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
Теперь последнее - мне нужно не одно конкретное слово, а несколько из них. Мы используем | знак, это означает выбор / или.
"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
.