1

みたいな構成で

string.scan(regex){...}

また

string.gsub(regex){...}

ループサイクルの一致が元の文字列の前のサイクルに隣接しているかどうかを確認するにはどうすればよいですか? たとえば、

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

"ab"、 、 の3 つの一致が"aab"あり"aaab"ます。各サイクル中に、変数continuedfalsetrue、およびにする必要がありfalseます。これ"ab"は、 が最初の一致サイクルで"aab"あり、それに隣接しており"c"、次の一致の前に中断するため"aaab"です。

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

前の一致位置の末尾を参照する、origuruma にアンカーはありますか? もしそうなら、それは正規表現で使用されるかもしれません。そうでない場合は、おそらく次のようなものを使用する必要がありますMatchData#offset。ループ内でいくつかの計算を行います。

ところで、\Gおりぐるまの正規表現って何?私が欲しいアンカーかもしれないという印象がありましたが、それが何であるかはわかりません。

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 に答える