ruby – 如何获取字符串中所有出现的模式的索引
发布时间:2020-12-16 21:51:44 所属栏目:百科 来源:网络整理
导读:string = "Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. "d = string.match(/(jack|jill)/i) # - MatchData "Jill" 1:"Jill"d.size # - 1 这只是第一次出现的情况. string
string = "Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. " d = string.match(/(jack|jill)/i) # -> MatchData "Jill" 1:"Jill" d.size # -> 1 这只是第一次出现的情况. 我如何获取模式的所有匹配实例及其索引(位置)的列表? 解决方法
您可以使用.scan和$`全局变量,这意味着最后一次成功匹配的左侧的字符串,但在通常的.scan中不起作用,所以您需要这个hack(从
this answer偷来):
string = "Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. " string.to_enum(:scan,/(jack|jill)/i).map do |m,| p [$`.size,m] end 输出: [0,"Jack"] [9,"Jill"] [57,"Jack"] [97,"Jill"] UPD: 注意lookbehind的行为 – 你得到真正匹配的部分的索引,而不是外观: irb> "ab".to_enum(:scan,/ab/ ).map{ |m,| [$`.size,$~.begin(0),m] } => [[0,"ab"]] irb> "ab".to_enum(:scan,/(?<=a)b/).map{ |m,m] } => [[1,1,"b"]] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |