Подтвердить что ты не робот

Регулярное выражение для соответствия целому слову

Я хочу сопоставить регулярное выражение для целого слова.

В следующем примере я пытаюсь сопоставить s или season, но у меня есть совпадения s, e, a, o и n.

[s|season]

Как сделать регулярное выражение для соответствия целому слову?

4b9b3361

Ответ 1

Квадратные скобки предназначены для класса символов, и вы на самом деле пытаетесь сопоставить любой из: s, |, s (снова), e, a, s ( снова), o и n.

Вместо группировки используйте скобки:

(s|season)

или не захватывающая группа:

(?:s|season)

Примечание. Группы, не связанные с захватом, сообщают движку, что ему не нужно сохранять совпадение, в то время как другой (группа захвата). Для небольших вещей, как работает, для "тяжелого" материала, вы можете сначала увидеть, если вам нужен матч или нет. Если вы этого не сделаете, лучше использовать группу без захвата, чтобы выделять больше памяти для вычисления вместо того, чтобы хранить что-то, что вам никогда не понадобится.

Ответ 2

Используйте этот онлайн-пример, чтобы проверить свой шаблон:

enter image description here

Над снимком экрана, взятым из этого живого примера: 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, см. Визуальный анализ того, что делает wordboundary от jex.im/regulex

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" не является.

Ответ 3

[ ] определяет класс символов. Таким образом, каждый персонаж, который вы там установили, будет соответствовать. [012] будет соответствовать 0 или 1 или 2 и [0-2] ведет себя одинаково.

То, что вы хотите, это группировки для определения or-statement. Используйте (s|season) для вашей проблемы.

Btw. вы должны следить. Метасимволы в нормальном регулярном выражении (или внутри группировки) отличаются от символьного класса. Класс символов похож на подязык. [$A] будет соответствовать только $ или A, больше ничего. Не бежать сюда за доллар.

Ответ 4

Я тестирую примеры в 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

Ответ 5

Для нечувствительного к регистру поиска используйте

([sS][eE][aA][sS][oO][nN])

Для поиска в нижнем регистре

([s][e][a][s][o][n])

Для поиска верхнего регистра

([s][e][a][s][o][n])