gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:23 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com