ruby regex:匹配并获取位置

y53ybaqx  于 12个月前  发布在  Ruby
关注(0)|答案(3)|浏览(113)

我想匹配一个正则表达式并获取匹配的字符串中的位置
比如说,

"AustinTexasDallasTexas".match_with_posn /(Texas)/

字符串
我希望match_with_posn返回类似于:[6, 17]其中6和17是单词Texas的两个示例的起始位置。
有这样的吗?

41ik7eoe

41ik7eoe1#

使用Ruby 1.8.6+,你可以这样做:

require 'enumerator' #Only for 1.8.6, newer versions should not need this.

s = "AustinTexasDallasTexas"
positions = s.enum_for(:scan, /Texas/).map { Regexp.last_match.begin(0) }

字符串
这将创建一个数组,其中:

=> [6, 17]

6l7fqoea

6l7fqoea2#

例如:String#index

"AustinTexasDallasTexas".index /Texas/
=> 6

字符串
现在,您可以扩展String API。

class String
  def indices e
    start, result = -1, []
    result << start while start = (self.index e, start + 1)
    result
  end
end
p "AustinTexasDallasTexas".indices /Texas/
=> [6, 17]

jdgnovmf

jdgnovmf3#

"AustinTexasDallasTexas".gsub(/Texas/).map { Regexp.last_match.begin(0) }
  #=> [6, 17]

字符串

"AustinTexasDallasTexas".gsub('Texas').map { Regexp.last_match.begin(0) }
  #=> [6, 17]


这使用了String#gsub的形式(未充分利用),它有一个参数,没有块,并返回一个枚举器。
这种形式的gsub被认为与替换字符串中的子字符串无关。相反,它只是枚举其参数的匹配项。可以说,它应该是一个单独的字符串方法,可能命名为each_match
我发现这种形式的gsub有很多用途,这有点离题,但考虑到人们普遍缺乏对如何利用它的认识,让我给予另一个使用它的例子。
假设我们有一个字符串

str = "aabccc"


并希望返回一个数组,该数组包含所有连续字符的子串,这些子串都是相等的(即["aa", "ccc"])。
我们可以通过匹配

rgx = /(.)\1+/


如果我们使用String#scan,

str.scan(rgx)
  #=> [["a"], ["c"]]


这个返回值--这不是我们想要的--反映了scan在其参数是包含捕获组的正则表达式时的工作方式。
相反,如果我们使用gsub,我们得到

enum = str.gsub(rgx)
  ##<Enumerator: "aabccc":gsub(/(.)\1+/)>
enum.to_a
  #=> ["aa", "ccc"]

的字符串

相关问题