1

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

规则是将item块内的所有内容begin1更改end1love,它可能跨越多行

替换后,输出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')
4

2 回答 2

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

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

另外,我不禁要说,正则表达式对于这样的任务来说是很差的工具。复杂的正则表达式太难以理解也太难以维护了,它们就像黑魔法——你永远不知道它们什么时候会崩溃:)

于 2012-02-02T21:30:06.527 回答
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"

这是一种简单的正则表达式替换方法。 阅读文档以获取有关如何使用它的更多详细信息。我认为你可能让它变得比它需要的更复杂。

于 2012-02-02T16:02:07.033 回答