Обратите внимание, что это в ответ на комментарий д-ра Зима:
"Как ни странно, оба способа работают нормально. Я выбрал" Регулятор ", который, по крайней мере, показывает, как разбивается регулярное выражение. Если у него есть возможность установить реализацию, я думаю, что я в бизнесе."
но мой ответ был слишком длинным для поля для комментариев.
Нет, вам не нужно избегать плюса, а в данном случае дефиса. Внутри класса символов следующие символы имеют особое значение: ]
, ^
и -
. Эти три символа являются единственными символами, которые могут * нуждаться в экранировании (обратите внимание, что [
не требует экранирования!). Я говорю может , потому что это зависит от того, где эти метасимволы встречаются. ^
имеет специальное значение (например, индикатор отрицания ) только в том случае, если он находится в начале класса символов, в другом месте он не нуждается в экранировании и будет соответствовать только буквальному значению ^
. Некоторые примеры для иллюстрации:
[^a] // special meaning: matches any character except 'a'
[a^] // matches 'a' or '^'
[\^a] // matches '^' or 'a'
И дефис имеет специальное значение (например, указатель диапазона ), когда ставится , а не в начале или конце класса символов. Примеры:
[a-c] // special meaning: matches 'a', 'b' or 'c'
[ac-] // matches 'a', 'c' or '-'
[-ac] // matches '-', 'a' or 'c'
[a\-c] // matches 'a', '-' or 'c'
Без сомнения, некоторые реализации регулярных выражений могут отличаться от того, что я только что опубликовал, но большинство языков будут соответствовать этим правилам (по крайней мере, все языки, с которыми я работал!). И, как вы заметили, безопаснее экранирования символов внутри классов символов: это не причинит никакого вреда. Оба класса [+]
и [\+]
будут соответствовать литералу +
. ИМХО, первое предпочтительнее, потому что я нахожу регулярное выражение со слишком многими побегами, которые трудно прочитать. Но некоторые не согласятся со мной и обнаружат, что при использовании escape (хотя и не обязательно) становится совершенно ясно, что вместо жадного квантификатора сопоставляется литерал +
.
Надеюсь, что все прояснилось.