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

标签 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

规则是将begin1end1 block 内的所有item都变成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')

最佳答案

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

(请注意,只有当您的“标记”是“正确的”时它才能正常工作——例如,没有结尾或开头,没有嵌套 block )

此外,我不能不说正则表达式是完成此类任务的糟糕工具。复杂的正则表达式太难理解也太难维护,它们就像黑魔法——你永远不知道它们什么时候会崩溃:)

关于ruby - 正则表达式 *仅* 当它们包含在开始/结束括号之间时替换子字符串出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115018/

相关文章:

java - jsp与json格式的webservice数据进行字符串匹配和 checkin

r - 如何在R中用相同的字符串替换多个字符串

Ruby 每个循环的最后一次迭代

ruby-on-rails - 如何为不同的应用程序使用自定义 ruby​​ 和 rails?

Python正则表达式替换单个换行符并忽略两个或多个换行符的序列

javascript 正则表达式 维度

regex - 替换 R 中第一次出现的 ":",但不替换第二次出现的

r - 替换和删除列名称中的字符

ruby - Ruby 上的 <<- 运算符,它在哪里记录?

mysql - 循环遍历 Rails 中的多个属性