Какой язык / реализацию регулярного выражения вы используете?
Gumbo
Что интересно, я искал этот вопрос для Javascript. Но затем моя IDE сказала, что я использовал ненужный выход. Так myStr.replace(/[/:.-]+/gi, '_')что действительно, к моему удивлению. Я думал, что мне это понадобится /[\/:.-]+/gi. Я не могу решить, круто это или сбивает с толку.
Turbo
Ответы:
90
Какой контекст / язык? Некоторые языки используют /в качестве разделителя шаблона, поэтому да, вам нужно избегать его, в зависимости от языка / контекста. Вы избегаете его, помещая перед ним обратную косую черту: \/для некоторых языков (например, PHP) вы можете использовать другие символы в качестве разделителя, и поэтому вам не нужно его экранировать. Но AFAIK на всех языках, единственное особое значение /, которое он имеет, это то, что он может быть обозначенным разделителем шаблона.
В Perl вы можете выбрать альтернативные разделители. Вы не ограничены m//. Вы можете выбрать другой, например m{}. Тогда убегать не нужно. Фактически, Дамиан Конвей в «Perl Best Practices» утверждает, что m{}это единственный альтернативный разделитель, который следует использовать, и это подкрепляется Perl :: Critic (на CPAN). В то время как вы можете обойтись без использования множества альтернативных символов-разделителей, //и, {}похоже, их лучше всего расшифровать позже. Однако, если любой из этих вариантов приводит к слишком большому количеству экранирований, выберите тот, который лучше всего подходит для удобочитаемости. Типичные примеры являются m(...), m[...]и m!...!.
В случаях, когда вы либо не можете, либо предпочитаете не использовать альтернативные разделители, вы можете избежать косой черты с помощью обратной косой черты: m/\/[^/]+$/например (используя альтернативный разделитель, который может быть m{/[^/]+$}, что может читаться более четко). Экранирование косой черты с помощью обратной косой черты достаточно распространено, чтобы заслужить имя и страницу в Википедии: Синдром наклонной зубочистки . В регулярных выражениях, где есть только один экземпляр, экранирование косой черты может не подняться до уровня, который считается помехой для разборчивости, но если он начнет выходить из-под контроля и если ваш язык допускает альтернативные разделители, как Perl, это быть предпочтительным решением.
Вы можете привести пример? У меня это: 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 (для совпадения)»;
myStr.replace(/[/:.-]+/gi, '_')
что действительно, к моему удивлению. Я думал, что мне это понадобится/[\/:.-]+/gi
. Я не могу решить, круто это или сбивает с толку.Ответы:
Какой контекст / язык? Некоторые языки используют
/
в качестве разделителя шаблона, поэтому да, вам нужно избегать его, в зависимости от языка / контекста. Вы избегаете его, помещая перед ним обратную косую черту:\/
для некоторых языков (например, PHP) вы можете использовать другие символы в качестве разделителя, и поэтому вам не нужно его экранировать. Но AFAIK на всех языках, единственное особое значение/
, которое он имеет, это то, что он может быть обозначенным разделителем шаблона.источник
Вот несколько вариантов:
В Perl вы можете выбрать альтернативные разделители. Вы не ограничены
m//
. Вы можете выбрать другой, напримерm{}
. Тогда убегать не нужно. Фактически, Дамиан Конвей в «Perl Best Practices» утверждает, чтоm{}
это единственный альтернативный разделитель, который следует использовать, и это подкрепляется Perl :: Critic (на CPAN). В то время как вы можете обойтись без использования множества альтернативных символов-разделителей,//
и,{}
похоже, их лучше всего расшифровать позже. Однако, если любой из этих вариантов приводит к слишком большому количеству экранирований, выберите тот, который лучше всего подходит для удобочитаемости. Типичные примеры являютсяm(...)
,m[...]
иm!...!
.В случаях, когда вы либо не можете, либо предпочитаете не использовать альтернативные разделители, вы можете избежать косой черты с помощью обратной косой черты:
m/\/[^/]+$/
например (используя альтернативный разделитель, который может бытьm{/[^/]+$}
, что может читаться более четко). Экранирование косой черты с помощью обратной косой черты достаточно распространено, чтобы заслужить имя и страницу в Википедии: Синдром наклонной зубочистки . В регулярных выражениях, где есть только один экземпляр, экранирование косой черты может не подняться до уровня, который считается помехой для разборчивости, но если он начнет выходить из-под контроля и если ваш язык допускает альтернативные разделители, как Perl, это быть предпочтительным решением.источник
perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf
И у меня возникают конфликты с косой чертой.s
, а неm
, когда выполняете замену (также известную как подстановка) с регулярными выражениями. perlfect.com/articles/regex.shtmlperl -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
потому что он избегает интерполяции оболочки./
символа является использование функции регулярного выражения для указания символа с помощью его кодировки ASCII в шестнадцатеричном или восьмеричном формате. Perl принимает восьмеричную форму\57
(источник regular-expressions.info/refcharacters.html )Используйте обратную косую черту
\
или выберите другой разделитель, например,m#.\d#
вместо/.\d/
«В Perl вы можете изменить разделитель / регулярного выражения почти на любой другой специальный символ, если перед ним стоит буква m (для совпадения)»;источник
Если разделителем является /, вам нужно будет экранировать.
источник
Если вы используете C #, вам не нужно его избегать.
источник
Для java этого не нужно.
Если вы поставите \ перед /. IDE сообщит вам "Redundant Character Escape" \ / "in ReGex"
источник