Regex для замены вхождений подстроки * только *, когда они заключены в начальные / конечные скобки - PullRequest
1 голос
/ 02 февраля 2012

регулярное выражение в ruby, и по какой-то причине мне нужно это в одной строке в методе gsub в ruby ​​

Предположим, что строковая переменная sample является многострочной, как показано ниже

begin1 item abc item abc item 
extra end1
begin2 item abc item abc extra end2
begin1 item abc item abc extra end1

Правило состоит в том, чтобы изменить все item, которые внутри блока begin1 и end1, на love, это может быть в нескольких строках

После замены вывод sample должен быть

begin1 love abc love abc love 
extra end1
begin2 item abc item abc extra end2
begin1 love abc love abc love end1  

Решение выглядит примерно так

puts sample.gsub!(/(begin1.*)item*(.*end1)/m,'\1love\2')

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

А как насчет этого: sample.gsub!(/item(?=((?!begin1).)*end1)/m, 'love')?

И, чтобы сделать регулярное выражение немного менее волшебным:

/ 
  item              
  (?=               # look-ahead assertion
    (               
      (?!begin1)    # negative look-ahead assertion
      .             # any character that is not part of the 'begin1' sequence
    )*              # there's no 'begin1' after 'item' and before 'end1'
    end1            # there is 'end1' after 'item'
  )
/mx                 # /m - for multiline strings, x - for comments

(Обратите внимание, что он будет работать правильно, только если ваш«разметка» является «правильной» - например, нет конечных концов или начальных, нет вложенных блоков)

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

0 голосов
/ 02 февраля 2012

Я не совсем уверен, что вы имеете в виду под вводной частью вашего вопроса, поэтому я немного запутался, но я думаю, что вы используете gsub метод неправильно. Попробуйте это:

> string = 'begin1 item abc item abc item'
=> "begin1 item abc item abc item"
> string.gsub(/item/, 'love')
=> "begin1 love abc love abc love"

Это простой метод подстановки регулярных выражений. Прочтите документы для получения более подробной информации о том, как его использовать . Я думаю, что вы, возможно, делаете это более сложным, чем нужно.

...