正则表达式替换子字符串出现* *当它们被包含在开始/结束括号之间时

时间:2012-02-02 15:30:29

标签: ruby regex gsub string-substitution

ruby​​中的正则表达式问题,出于某种原因,我需要在一行中使用ruby的gsub方法

假设输入sample字符串变量是多行字符串,如下所示

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

规则是将块itembegin1内的所有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 个答案:

答案 0 :(得分:3)

这个怎么样: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

(注意,只有当''标记''正确'时它才能正常工作 - 例如没有尾端或前导开始,没有嵌套块)

另外,我不禁要说正则表达式是这项任务的糟糕工具。复杂的正则表达式太难以理解且太难以维护,它们就像黑魔法 - 你永远不知道它们何时会崩溃:)

答案 1 :(得分:0)

我不完全确定你的问题的输入部分是什么意思,所以我有点困惑,但我认为你以错误的方式使用gsub方法。试试这个:

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

这是一种简单的正则表达式替换方法。 Read the docs for more details on how to use it。我认为你可能会使它变得比它需要的更复杂。