Трудности с использованием переменных с вызовом Ruby gsub для замены блока - PullRequest
1 голос
/ 27 апреля 2011

То, что я пытаюсь сделать, - это заменить блок текста (не заканчивающийся новыми строками) способом шаблона. Блок, который я хочу заменить, выглядит примерно так (чтобы сделать его более читабельным, я поместил значения переменных в скобки):

[varA][varB]_begin[varC]
content line 1
content line 2
...
[varA][varB]_end[varC]

И я хочу заменить все, включая первый varA и последний varC.

Я собрал скелет регулярного выражения, чтобы соответствовать этому. Итак, предположим, что varA были "<%" и varB были "block", а varC были "%>", регулярное выражение должно быть:

/<%block_beg%>(.*)<%block_end%>/m/

Я подтвердил, что этот шаблон должен работать (через rubyxp)

Но, конечно, это не так просто, потому что значения, которые мы использовали для varA, varB и varC в предыдущих примерах, должны предоставляться динамически.

Учитывая то, что я понимаю о gsub () Руби, по моей оценке должно работать следующее:

 gsub(/#{@varA}#{@varB}_beg#{@varC}(.*)#{@varA}#{@varB}_end#{@varC}/m, old_str)

Код работает без ошибок, но также ничего не заменяет. Может кто-нибудь сказать мне, почему это не работает? Должен ли я придерживаться другого подхода?

Пост-Примечание 1: @ связаны с тем, что переменные являются свойствами класса.

Пост-Примечание 2: Я исправил несколько вещей, и они все еще не работают. Теперь у меня есть:

 @content.gsub(/#{Regexp.escape(@varA)}#{Regexp.escape(@varB)}_beg#{Regexp.escape(@varC)}(.*)#{Regexp.escape(@varA)}#{Regexp.escape(varB)}_end#{Regexp.escape(@varC)}/m)

Кто-нибудь знает, почему это не работает?

1 Ответ

2 голосов
/ 27 апреля 2011

Ваш gsub выглядит не совсем правильно. Вот как бы я это сделал:

old_str.gsub(/#{varA}#{varB}_begin#{varC}(.*)#{varA}#{varB}_end#{varC}/m)

Кроме того, если ваши переменные являются строками, вы, вероятно, сначала захотите вызвать Regexp.escape для них, чтобы они соответствовали буквенным строкам, а не директивам регулярных выражений.

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