gpt4 book ai didi

regex - 两个文件路径标记之间包含特殊字符的匹配字符串

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

我正在尝试编写一个 ruby​​ 脚本,它将在其他两个字符串之间返回文本。问题是两个匹配的字符串包含特殊字符。转义特殊字符并不能解决问题。

我试过转义特殊字符、不同的匹配模式,并为变量提供匹配的字符串,但都不太顺利。

我还测试了仅使用 ODSNAME 作为分隔符的简化匹配。这似乎奏效了。

####Example contents of logfile 
#### 'aaaaaaaaa ODS | Filename = /tmp/bbbbbb | NAME = ccccc'

log_to_scan = 'logfile'
marker1 = 'ODS | FILENAME = /tmp/'
marker2 = ' | NAME'

contents = File.read(log_to_scan)

print contents.match(/ODS \| FILENAME = \/tmp\/(.*) \| NAME/m[1].strip

print contents.match(/marker1(.*)marker2/m)[1].strip

鉴于上面的示例内容,我希望输出为 bbbbbb。但是,我什么也没有得到,也没有得到 NoMethod 错误。不确定还有什么是真的,或者我犯了什么错误。

最佳答案

str = 'aaaaaaaaa ODS | Filename = /tmp/bbbbbb | NAME = ccccc'
marker1 = 'ODS | FILENAME = /tmp/'
marker2 = ' | NAME'

r = /(?<=#{Regexp.escape(marker1)}).*(?=#{Regexp.escape(marker2)})/i
#=> /(?<=ODS\ \|\ FILENAME\ =\ \/tmp\/).*(?=\ \|\ NAME)/i
str[r]
#=> "bbbbbb"

r = /#{Regexp.escape(marker1)}(.*)#{Regexp.escape(marker2)}/i
str[r,1]
#=> "bbbbbb"

或者,如果已知要匹配的字符串是小写的,或者返回小写的字符串是允许的:

s = str.downcase
#=> "aaaaaaaaa ods | filename = /tmp/bbbbbb | name = ccccc"
m1 = marker1.downcase
#=> "ods | filename = /tmp/"
m2 = marker2.downcase
#=> " | name"
id1 = s.index(m1) + m1.size
#=> 32
id2 = s.index(m2, id1+1) - 1
#=> 37
str[id1..id2]
#=> "bbbbbb"

参见 Regexp::escape .在 #1 中,

(?<=#{Regexp.escape(marker1)})

是一个积极的回顾,要求 marker1 紧接在匹配之前出现。

(?=#{Regexp.escape(marker2)})

是一个正面前瞻,要求 marker2 立即跟随匹配。

在 #3 中,我使用了 String#index 的形式需要第二个参数(“偏移量”)。

关于regex - 两个文件路径标记之间包含特殊字符的匹配字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56469554/

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