1

「@number」(/ @ \ d /)で示される文字列にいくつかのシーケンスがあります冗長なシーケンスを削除したいのですが、@2の後に@2が続きます。別の同一の@numberシーケンスがテキストのどこかの直後にあるため@2lorem@2ipsum、2番目の@ 2は削除されますが、@2lorem@1ipsum@2dolor@1は2つの@2シーケンスの間にあるため、何も削除されません。

"@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"

になります:

"@2randomtextrandomtextrandomtext@1bla@2bla2bla2
4

4 に答える 4

1
"@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2".gsub /(?<=(@\d))([^@]*)\1/,'\2'
=> "@2randomtextrandomtextrandomtext@1bla@2bla2bla2"
于 2013-03-10T14:53:36.307 に答える
1

あなたはそれをトークンに分割することができます:

my_string = "@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"
tokens = my_string.scan /(@\d+)?((?:(?!@\d+).)*)/
#=> [["@2", "randomtext"], ["@2", "randomtext"], ["@2", "randomtext"], ["@1", "bla"], ["@2", "bla2"], ["@2", "bla2"]]

次に、チャンク、マップ、および結合します。

tokens.chunk{|x| x[0].to_s}.map{|n, v| [n, v.map(&:last)]}.join
#=> "@2randomtextrandomtextrandomtext@1bla@2bla2bla2"
于 2013-03-10T07:58:02.370 に答える
0
my_string = "@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"

prev_sequence = String.new
penultimate_index = my_string.length - 2

for i in 0..penultimate_index
  if my_string[i] == '@'
    new_sequence = "@#{my_string[i+1]}"
    if new_sequence == prev_sequence
      my_string.slice!( i, 2 )
    else 
      prev_sequence = new_sequence
    end
  end
end


puts my_string
于 2013-03-10T01:41:10.467 に答える
-1

簡単...文字列を配列に分割し、その直後の数値を比較します。同じ場合は、削除してください。複雑なのは(それほど多くはありませんが)、ループ中に配列からエントリを削除できないことです...したがって、必要なのは再帰関数を作成することです...これが疑似です:

-=グローバル値=
-StringArrayをデカールし、OriginalString.SplitOn( "@")に設定します

-=メソッドRemoveLeadingDuplicates=-
カウンターを宣言   する前のリード==現在のリードの場合 はStringArray内の各文字列の
RemoveIndexループを宣言するループからの     RemoveIndex     ブレークを設定する   それ以外の場合     は前のリード=現在のリード カウンターを1つ増やす 終了ループ









RemoveIndexがnullでない場合
  指定されたインデックスのアイテムを配列から削除します
  。RemoveLeadingDuplicatesを呼び出します。

戻る

于 2013-03-10T01:28:56.917 に答える