0

私は次のような文字列を持っています:

--d--d-d---d--

この文字列内の「d」のすべての出現をオフセットとともに検索したいと思います。

ただし、次のことを行うと、最初の結果しか返されません。

irb(main):001:0> m = /d/.match "d--d-d---d"
=> #<MatchData "d">
irb(main):002:0> m.size
=> 1 

私は何が間違っているのですか?match文字列内のすべての正規表現に一致すると思いました。

4

4 に答える 4

0

オフセットを取得するには、次のようなループを使用できます。

s = '--d--d-d---d--'
offset = 0
while md = /d/.match(s,offset)
  p md.offset(0)[1]          
  # MatchDate#offset Returns a two-element array 
  # containing the beginning and ending offsets 
  offset = md.offset(0)[1]
end
于 2013-03-22T09:10:02.207 に答える
0

Regexp#matchパターンを 1 回だけ実行します。MatchDataには複数の一致を含めることができるため、複数のオフセットを含めることができます。最初のものは一致全体で、他は正規表現内のキャプチャ グループの内容です。正規表現を複数回適用した結果の MatchData には何もありません。

String#indexオフセットを直接生成し、文字列を反復処理するために簡単に使用できます。

s = '--d--d-d---d--'
[].tap{ |offsets| i=-1; while i = s.index('d', i+1); offsets << i; end }
=> [2, 5, 7, 11]
于 2013-03-22T15:49:22.990 に答える
0

私が探している答えは、実際にはこの質問にあります:文字列内のすべての Ruby 正規表現の一致データを取得するにはどうすればよいですか?

私が言ったように、MatchData の結果にはすべての一致が含まれている必要があると思いました。(この印象は、Ruby コア ドキュメント ( http://www.ruby-doc.org/core-2.0/MatchData.html ) から得ました)。

したがって、私はまだその部分を完全には理解していませんが、少なくとも上記の答えは、すべての出来事に到達するのに役立ちます.

于 2013-03-22T11:44:16.187 に答える
0

バリアントとして:

str = '--d--d-d---d--'
str.each_char.with_index.select{|el| el[0] == "d"}.map(&:last)

結果:

[2, 5, 7, 11]

0 から始まる文字の位置だけです。 1 から開始する必要がある場合は、 を使用するwith_index(1)と、結果は次のようになります。

[3, 6, 8, 12]
于 2013-03-22T12:05:44.277 に答える