Экранирование косой черты в регулярном выражении

106

Мой вопрос простой, и он касается экранирования регулярных выражений. Вам нужно избегать косой черты /в регулярном выражении? И как бы вы это сделали?

Зеробу
источник
1
Какой язык / реализацию регулярного выражения вы используете?
Gumbo
Что интересно, я искал этот вопрос для Javascript. Но затем моя IDE сказала, что я использовал ненужный выход. Так myStr.replace(/[/:.-]+/gi, '_')что действительно, к моему удивлению. Я думал, что мне это понадобится /[\/:.-]+/gi. Я не могу решить, круто это или сбивает с толку.
Turbo

Ответы:

90

Какой контекст / язык? Некоторые языки используют /в качестве разделителя шаблона, поэтому да, вам нужно избегать его, в зависимости от языка / контекста. Вы избегаете его, помещая перед ним обратную косую черту: \/для некоторых языков (например, PHP) вы можете использовать другие символы в качестве разделителя, и поэтому вам не нужно его экранировать. Но AFAIK на всех языках, единственное особое значение /, которое он имеет, это то, что он может быть обозначенным разделителем шаблона.

Crayon Violent
источник
38

Вот несколько вариантов:

  • В Perl вы можете выбрать альтернативные разделители. Вы не ограничены m//. Вы можете выбрать другой, например m{}. Тогда убегать не нужно. Фактически, Дамиан Конвей в «Perl Best Practices» утверждает, что m{}это единственный альтернативный разделитель, который следует использовать, и это подкрепляется Perl :: Critic (на CPAN). В то время как вы можете обойтись без использования множества альтернативных символов-разделителей, //и, {}похоже, их лучше всего расшифровать позже. Однако, если любой из этих вариантов приводит к слишком большому количеству экранирований, выберите тот, который лучше всего подходит для удобочитаемости. Типичные примеры являются m(...), m[...]и m!...!.

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

DavidO
источник
1
Вы можете привести пример? У меня это: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confИ у меня возникают конфликты с косой чертой.
CMCDragonkai 08
Обратите внимание, что вы используете s, а не m, когда выполняете замену (также известную как подстановка) с регулярными выражениями. perlfect.com/articles/regex.shtml
Машмагар
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
На странице, на которую ссылается lukeuser (спасибо), также есть Escape Sequence \ Q ... \ E. Это сработало для меня.
user3012857
11

Используйте обратную косую черту \или выберите другой разделитель, например, m#.\d#вместо /.\d/ «В Perl вы можете изменить разделитель / регулярного выражения почти на любой другой специальный символ, если перед ним стоит буква m (для совпадения)»;


источник
6

Если разделителем является /, вам нужно будет экранировать.

fvox
источник
0

Если вы используете C #, вам не нужно его избегать.

ShrapNull
источник
Может быть, но здесь они используют perl.
Toto
0

Для java этого не нужно.

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

Если вы поставите \ перед /. IDE сообщит вам "Redundant Character Escape" \ / "in ReGex"

Амзеро
источник