Регулярний вираз для виключення слова / рядка


298

У мене регулярний вираз:

^/[a-z0-9]+$

Це відповідає рядкам, таким як /helloабо /hello123.

Однак я хотів би, щоб він виключив пару значень рядків, таких як /ignoremeі /ignoreme2.

Я спробував декілька варіантів, але, здається, не змусив себе працювати!

Моя остання немічна спроба була

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

Будь-яка допомога буде вдячна :-)


1
Можливий дублікат: stackoverflow.com/questions/1395177/…
Anderson Green

Відповіді:


376

Ось ще один спосіб (використовуючи негативний погляд вперед ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Примітка: Там тільки один вислів захоплення: ([a-z0-9]+).


1
Блискуче, що, здається, зробило трюк. Мені справді потрібне це правило для переписування URL-адрес, і я хотів ігнорувати папки "images", "css" та "js". Тож моє правило таке: ^ / (?! css | js | images) ([az] +) /? (\? (. +))? $ І воно переписується в /Profile.aspx?id=$1&$3 Чи буде це правило правильно і також розповсюджувати рядок запиту? Тож якщо хтось відвідує mydomain.com/hello?abc=123, я хотів би переписати його на mydomain.com/Profile.aspx?id=hello&abc=123 Я також трохи не впевнений у виконанні (. +) На кінець, щоб захопити рядок запиту в оригінальному запиті.
romiem

Здається, це вже інше питання. Зображення, яке у вас є, виглядає так, що воно буде захоплювати рядок запиту - протестуйте і подивіться, чи походить ваша рядок запиту. Також - (\?(.+))?$повинні бути швидкими. Я б не переймався надто швидкістю.
Сет

1
Це не спрацювало для мене, тоді як рішення Alix Axel все-таки спрацювало. Я використовую java.util.regex.Patternклас Java .
Марк Єронімус

1
Я підтверджую ремарк Марка;) - наприклад, Pycharm заснований на Java, чи не так? Отже, враховуючи регулярні вирази в пошуку Pycharm, рішення Аліксу працює, інше - ні.
фан

43

Це слід зробити:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

Ви можете додати скільки завгодно проігнорованих слів, ось проста реалізація PHP:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

я думав, що огляд потребує фіксованої ширини?
симон

2
@AlixAxel Це так, але розумніші конвертики з регулярними виразками дозволять чергувати з різною довжиною для альтернатив (і використовувати найдовші), якщо кожна альтернатива має фіксовану довжину.
ChrisF

це розумно, але для мене не вдається, якщо ігнороване слово стоїть на кінці будь-якого іншого слова. тобто якщо ви додасте "a" як ігноровані слова, то будь-яке слово, яке закінчується на a, ігнорується
singmotor

21

Оскільки ви хочете виключити обидва слова, вам потрібна сполука:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

Тепер обидві умови повинні бути істинними (ні ignoreme, ні ignoreme2 не дозволяється), щоб мати збіг.


1
Це еквівалентно коротшому вище, що є негативним підходом до набору альтернатив.
ChrisF

4
@ChrisF Ні, не дуже. Рішення Сет не відповідатиме що - щось на зразок /ignoremenotяк /слід ignoreme.
Гумбо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.