Ухилення від нахилу вперед у регулярному виразі


106

Моє запитання є простим, і воно стосується регулярного висловлювання. Чи потрібно уникнути прямої косої риси /у звичайному виразі? І як би ви зробили це робити?


1
Якою мовною / регулярною реалізацією виразів ви користуєтесь?
Гумбо

Цікаво, що я шукав це питання для Javascript. Але тоді мій IDE сказав, що я використовую зайву втечу. Так myStr.replace(/[/:.-]+/gi, '_')справедливо на мій подив. Я думав, що мені знадобиться /[\/:.-]+/gi. Я не можу вирішити, чи це круто чи заплутано.
Турбо

Відповіді:


90

Який контекст / мова? Деякі мови використовують /як роздільник візерунка, так що так, вам потрібно уникнути цього, залежно від мови / контексту. Ви уникаєте цього, поставивши перед ним зворотну косу рису: \/Для деяких мов (наприклад, PHP) ви можете використовувати інші символи як роздільник, і тому вам не потрібно уникати цього. Але AFAIK на всіх мовах, єдине особливе значення, яке він /має, це може бути призначений роздільник візерунка.


38

Ось кілька варіантів:

  • У Perl можна вибрати альтернативні роздільники. Ви не обмежені m//. Ви можете вибрати інші, наприклад m{}. Тоді рятуватися не потрібно. Власне кажучи, Даміан Конвей у "Найкращій практиці Perl" стверджує, що m{}це єдиний альтернативний роздільник, який слід використовувати, і це підкріплюється Perl :: Critic (на CPAN). У той час як ви можете піти з використання різних символів, що знаходяться по черзі, //і, {}здається, найясніше розшифрувати їх згодом. Однак якщо будь-який із цих варіантів призведе до занадто великої кількості уникнути, виберіть те, що краще піддається розбірливості. Типові приклади є m(...), m[...]і m!...!.

  • У тих випадках, коли ви не можете або не бажаєте використовувати альтернативні роздільники, ви можете уникнути нахильної косої риски за допомогою зворотної косої риси: m/\/[^/]+$/наприклад (використовуючи альтернативний роздільник, який міг би стати m{/[^/]+$}, який може прочитати чіткіше). Ухилення від косої риски нахилом від зворотного кута є досить поширеним, щоб заробити ім'я та сторінку вікіпедії: Синдром нахиленої зубочистки . У регулярних виразах, де є лише один екземпляр, ухилення від косої риски може не піднятися до рівня, коли вона вважатиметься перешкодою для розбірливості, але якщо вона почне виходити з рук, і якщо ваша мова дозволяє альтернативні обмежувачі, як це робиться Perl, це буде бути кращим рішенням.


1
Чи можете ви навести приклад? Я маю це: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confІ я отримую конфлікти із пересічними прямими руками.
CMCDragonkai

Зауважте, що ви використовуєте an s, а не mпід час заміни (ака-замінника) регулярними виразами. perlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... але це, мабуть, краще: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confадже це дозволяє уникнути інтерполяції оболонки.
DavidO

1
Альтернативою уникненню прямого /символу є використання функцій регулярного вираження для визначення символу за допомогою його кодування ASCII в шістнадцятковому або восьмеричному вікнах. Perl , приймає форму восьмеричної \57(джерело regular-expressions.info/refcharacters.html )
lukeuser

На сторінці, пов’язаній лукеузером (спасибі), також є послідовність втечі \ Q ... \ E. Це працювало для мене.
користувач3012857

11

Використовуйте зворотний нахил \або виберіть інший роздільник, тобто m#.\d#замість /.\d/ "У Perl ви можете змінити роздільник / регулярний вираз майже на будь-який інший спеціальний символ, якщо ви перейдете до нього з буквою m (для відповідності);"



0

Якщо ви використовуєте C #, вам не потрібно уникати цього.


Можливо, але тут вони використовують perl.
Toto

0

Для Java не потрібно.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Якщо ви поставите \ перед /. IDE скаже вам "Уникнення надмірних символів" \ / "в ReGex"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.