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
内的所有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')
答案 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。我认为你可能会使它变得比它需要的更复杂。