Регулярний вираз, щоб відповідати слову або його префіксу


119

Я хочу відповідати регулярному виразу цілому слову.

У наступному прикладі я намагаюся відповідати sабо seasonале то , що у мене є сірники s, e, a, oі n.

[s|season]

Як зробити регулярний вираз, щоб відповідати цілому слову?


4
Використовуйте (season|s)замість цього. [season]відповідає будь-якому s, e, a, o, n.
фальсетру

Відповіді:


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, див .: Візуальний аналіз того, що працює з межею слова від 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 +;)
Щось

Я використовую 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 

Тепер останній - мені потрібно не 1 конкретне слово, а деякі з них. Ми використовуємо | знак, це означає вибір / або.

"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.