Ruby string sub без обратных ссылок на регулярные выражения - PullRequest
8 голосов
/ 15 ноября 2011

Я пытаюсь создать простую строковую подпрограмму в Ruby.

Второй аргумент sub () - это длинный фрагмент минимизированного JavaScript, в котором содержатся регулярные выражения.Обратные ссылки в регулярном выражении в этой строке, похоже, влияют на результат sub, потому что замещенная строка (то есть первый аргумент) появляется в выходной строке.

Пример:

input = "string <!--tooreplace--> is here"
output = input.sub("<!--tooreplace-->", "\&")

Я хочу, чтобы вывод был:

"string \& is here"

Не:

"string & is here"

или, если экранировать регулярное выражение

"string <!--tooreplace--> is here"

В принципе, я хочу какой-товыполнение строкового подпрограммы, которая вообще не имеет последствий для регулярных выражений - просто замена строки.

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Чтобы избежать необходимости выяснять, как избежать строки замены, используйте Regex.escape. Это удобно, когда замена сложна, или иметь дело с ней - ненужная боль. Маленький помощник на String тоже хорош.

input.sub("<!--toreplace-->", Regexp.escape('\&'))
3 голосов
/ 15 ноября 2011

Вы также можете использовать блочную нотацию, чтобы упростить ее (в отличие от Regexp.escape):

=> puts input.sub("<!--tooreplace-->") {'\&'}
string \& is here
2 голосов
/ 15 ноября 2011

Используйте одинарные кавычки и избегайте обратной косой черты:

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here"
0 голосов
/ 15 ноября 2011

Что ж, поскольку '\\&' (то есть \, за которым следует &) интерпретируется как специальное выражение регулярного выражения, понятно, что вам необходимо избегать обратной косой черты.На самом деле это работает:

>> puts 'abc'.sub 'b', '\\\\&'
a\&c

Обратите внимание, что \\\\& представляет собой буквенную строку \\&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...