1

在像这样的建筑中

string.scan(regex){...}

或者

string.gsub(regex){...}

如何检查循环循环的匹配是否与原始字符串中的前一个相邻?例如,在

"abaabcaaab".scan(/a+b/){|match|
    ...
    continued = ...
    ...
}

将有 3 个匹配项"ab""aab""aaab"。在每个周期中,我希望它们的变量分别continuedfalsetrue和 ,false因为"ab"是第一个匹配周期,"aab"与它相邻,并"c"在下一个匹配之前中断"aaab"

"ab" #=> continued = false
"aab" #=> continued = true
"aaab" #=> continued = false

origuruma 中是否有一个锚点是指上一个匹配位置的结尾?如果是这样,那可以在正则表达式中使用。如果没有,我可能需要使用MatchData#offset. 并在循环中进行一些计算。

顺便说一句,\Goriguruma 正则表达式中有什么?我的印象是它可能是我想要的锚,但我不确定它是什么。

4

2 回答 2

1

StringScanner 非常适合这项任务:http ://corelib.rubyonrails.org/classes/StringScanner.html

require 'strscan'
s = StringScanner.new('abaabcaaab')

begin
        puts s.pos
        s.scan_until(/a+b/)
        puts s.matched
end while !s.matched.nil?

输出

0
ab
2
aab
5
aaab
10
nil

因此,您可以跟踪最后一场比赛的长度和位置,并进行数学运算以查看它们是否相邻。

于 2012-08-25T05:28:34.043 回答
1

我不相信使用这些方法可以获得偏移数据。您可能必须使用Regexp#match, 每次传递该位置。返回的MatchData对象还包含进行任何替换等所需的所有信息。

当然,如果你在增加偏移量的同时进行字符串替换,如果替换的长度与匹配的长度不同,你必须小心。这里的一个常见模式是向后移动字符串,但我认为您无法使用这些方法遵循该模式,因此您需要调整偏移量。

编辑 | 实际上,如果您在完全独立的步骤中进行替换,您将能够向后移动字符串。首先找到您需要替换的所有内容以及偏移量。接下来,以相反的顺序迭代该列表,进行替换。

于 2012-08-25T04:38:29.793 回答