【发布时间】:2012-08-25 04:04:21
【问题描述】:
在类似的结构中
string.scan(regex){...}
或
string.gsub(regex){...}
如何检查循环循环的匹配是否与原始字符串中的前一个相邻?例如,在
"abaabcaaab".scan(/a+b/){|match|
...
continued = ...
...
}
将有三个匹配项"ab"、"aab" 和"aaab"。在每个循环中,我希望他们将变量 continued 分别设为 false、true 和 false,因为 "ab" 是第一个匹配循环,"aab" 与之相邻,@987654334 @在下一场比赛之前中断"aaab"。
"ab" #=> continued = false
"aab" #=> continued = true
"aaab" #=> continued = false
origuruma 中是否有一个锚点指向上一个匹配位置的结尾?如果是这样,那可以在正则表达式中使用。如果没有,我可能需要使用MatchData#offset 之类的东西。并在循环中进行一些计算。
顺便问一下,origuruma 正则表达式中的\G 是什么?我的印象是它可能是我想要的锚,但我不确定它是什么。
【问题讨论】:
-
不幸的是,
scan和gsub都不能与 MatchData 对象一起使用。您可以编写自己的scan,这很容易,只需使用match及其偏移支持。 -
@muistooshort
$~和$~.offset可用于scan。例如,` "aaaaaaaaaa".scan(/./){|x| p $~.offset(0)}` 没问题。 -
谢谢,我一直无法记住所有的魔法全局变量。我仍然认为如果
scan给你一个 MatchData 会更好,命名的捕获组有点'方便。 PS:geocities.jp/kosako3/oniguruma/doc/RE.txt,我不知道这是不是最新的参考,但那是我收藏的。
标签: ruby regex ruby-1.9.3 oniguruma