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
规则是将begin1
和end1
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/