Регулярное выражение для соответствия слову или его префиксу


119

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

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

[s|season]

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


4
(season|s)Вместо этого используйте . [season]соответствует любому s, e, a, o, n.
falsetru

Ответы:


137

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

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

(s|season)

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

(?:s|season)

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


Да, я это понял. Мне не хватало захвата. Я думал, что использование () всегда будет соответствовать, зная, что есть возможность не совпадать, это удобно, спасибо.
NMGod

Вы неправильно это поняли. ?:Внутри группировка ака non-capturingпросто говорит, что вы не можете использовать совпавшие выражения с $1, $2и так далее ... Если вы хотите , чтобы выражение не соответствует, что вам нужно ^.
EverythingRightPlace

@ NMGodA1b2c3d4 Добро пожаловать! Вы имеете в виду вариант не совпадать или не ловить (разница есть, да). Если вы не хотите совпадать ни с одним из них, вы будете использовать (?! ... )вставку, то есть (?!s|season)в данном случае.
Джерри

126

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

введите описание изображения здесь

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

Визуальное изображение 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» нет.


3
проголосовали за, потому что мне нужен символ \ b, и я этого не знал!
Nieminen

Почему это подробное объяснение не является ответом?
dewwwald

1
Потому что человек, который разместил вопрос, выбрал первый ответ, который пришел, и не потрудился переключиться на мой, когда позже пришел мой значительно превосходящий ответ. Вы можете задать задающему вопрос через комментарий под вопросом, чтобы изменить выбор ответа на этот, и это повысит ценность этой страницы для людей, которые на нее попадают.
Эрик Лещинский

1
Я поддержал, потому что вы использовали слово «пердеть» в своем примере ... и мне нужен был \ w +;)
SomethingOn

Я использую regexr.com
Applez00800

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, который возвращает объект-результат. Это помогает 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

2

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

Вам нужны группировки для определения оператора или. Используйте (s|season)для своего вопроса.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.