2013-06-14 2 views
0

Предположим, я следующую строку:Строка GSUB - Заменить символы между двумя элементами, но оставить окружающие элементы

MyString = «старт/ABC123/конец»

Как вы можете сращивани вне abc123 с чем-то еще, оставив элементы «/ start /» и «/ end» неповрежденными?

У меня было следующее, чтобы соответствовать шаблону, но он заменяет всю строку. Я надеялся просто заменить его abc123 на 123abc.

mystring.gsub(/start\/(.*)\/end/,"123abc") #=> "123abc" 

Edit: Символы между концевыми элементами запуска & может быть любая комбинация алфавитно-цифровых символов, я изменил свой пример, чтобы отразить это.

+0

является его всегда рядом? –

+0

@HunterMcMillen Я отредактировал мой вопрос. – Noz

+0

Вы можете просто положить 'start' и' end' между скобками и ссылкой на них в вашей замене. [Демонстрация] (http://regex101.com/r/jG0zT2) – HamZa

ответ

4

Вы можете сделать это с помощью этого класса символов: [^\/] (все, что не слэш) и lookarounds

mystring.gsub(/(?<=start\/)[^\/]+(?=\/end)/,"7") 
2

Для примера, вы могли бы, возможно, использовать:

mystring.gsub(/\/(.*?)\//,"/7/") 

Это будет соответствовать два слэша между строкой, которую вы заменяете, и возвращаете обратно в замещение.

0

Проблема в том, что вы заменяете всю согласованную строку, "start/8/end", с «7». Вам нужно включить совпавшие символы, которые вы хотите упорствовать:

mystring.gsub(/start\/(.*)\/end/, "start/7/end") 

В качестве альтернативы, просто соответствуют цифрам:

mystring.gsub(/\d+/, "7") 
1

В качестве альтернативы, вы можете захватить куски строки, которую вы хотите сохранить, и интерполировать их вокруг замены, это оказывается гораздо более читаемым, чем lookaheads/просмотра назад:

irb(main):010:0> mystring.gsub(/(start)\/.*\/(end)/, "\\1/7/\\2") 
=> "start/7/end" 

\\1 и \\2 здесь относятся к пронумерованным изображениям внутри вашего регулярного выражения.

0

Вы можете сделать это, группируя начальные и конечные элементы в регулярном выражении, а затем со ссылкой на эти группы в в строке подстановки:

mystring.gsub(/(?<start>start\/).*(?<end>\/end)/, "\\<start>7\\<end>") 
Смежные вопросы