Я хочу сопоставить регулярное выражение для целого слова.
В следующем примере я пытаюсь сопоставить s
или season
, но у меня есть совпадения s
, e
, a
, o
и n
.
[s|season]
Как сделать регулярное выражение для соответствия целому слову?
Я хочу сопоставить регулярное выражение для целого слова.
В следующем примере я пытаюсь сопоставить s
или season
, но у меня есть совпадения s
, e
, a
, o
и n
.
[s|season]
Как сделать регулярное выражение для соответствия целому слову?
Квадратные скобки предназначены для класса символов, и вы на самом деле пытаетесь сопоставить любой из: s
, |
, s
(снова), e
, a
, s
( снова), o
и n
.
Вместо группировки используйте скобки:
(s|season)
или не захватывающая группа:
(?:s|season)
Примечание. Группы, не связанные с захватом, сообщают движку, что ему не нужно сохранять совпадение, в то время как другой (группа захвата). Для небольших вещей, как работает, для "тяжелого" материала, вы можете сначала увидеть, если вам нужен матч или нет. Если вы этого не сделаете, лучше использовать группу без захвата, чтобы выделять больше памяти для вычисления вместо того, чтобы хранить что-то, что вам никогда не понадобится.
Над снимком экрана, взятым из этого живого примера: https://regex101.com/r/cU5lC2/1
Я буду использовать интерактивную оболочку phpsh на Ubuntu 12.10, чтобы продемонстрировать PCRE regex engine через метод, известный как preg_match
Запустите phpsh, поместите некоторый контент в переменную, сопоставьте слово.
[email protected]:~/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 - нет.
[email protected]:~/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
и по-прежнему соответствует этой проблеме. Итак, на следующем примере.
Границы Word могут быть сопоставлены с помощью \b
, см.
Regex Visual Image, полученный из http://jex.im/regulex и https://github.com/JexCheng/regulex Пример:
[email protected]:~/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" не является.
[ ]
определяет класс символов. Таким образом, каждый персонаж, который вы там установили, будет соответствовать. [012]
будет соответствовать 0
или 1
или 2
и [0-2]
ведет себя одинаково.
То, что вы хотите, это группировки для определения or-statement. Используйте (s|season)
для вашей проблемы.
Btw. вы должны следить. Метасимволы в нормальном регулярном выражении (или внутри группировки) отличаются от символьного класса. Класс символов похож на подязык. [$A]
будет соответствовать только $
или A
, больше ничего. Не бежать сюда за доллар.
Я тестирую примеры в 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, который возвращает объект-результат. Это помогает, например, для получения информации о месте/индексе нашего слова.
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
Для нечувствительного к регистру поиска используйте
([sS][eE][aA][sS][oO][nN])
Для поиска в нижнем регистре
([s][e][a][s][o][n])
Для поиска верхнего регистра
([s][e][a][s][o][n])