0

ファイルを解析して、いくつかの日/日付を置き換えようとしています。

例えば、変えたい

In a post on the band's blog last night (06.05.12) 
to 
In a post on the band's blog sunday night

私はgsubを使おうとしています!そうするために。

r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei,Date.strptime('\1',"%d.%m.%y").strftime("%A").to_s + ' night')

常に無効な日付と表示されますが、

r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei,'\1')

正しい日付を 06.05.12 として表示し、

mydate = '06.05.12'
r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei,Date.strptime(mydate,"%d.%m.%y").strftime("%A").to_s + ' night')

適切な応答を返します。Date.strptime を使用しているときに mydate を \1 に置き換えても機能しないのはなぜですか? これを回避する方法について何か提案はありますか?

4

1 に答える 1

1

日付関数で一致グループを参照しようとしているようです。しかし、これはうまくいきません。この構文は、単純な文字列を置き換える場合にのみ使用できます。関数は、渡された文字列内のgsubすべての参照を置き換えますが、実際に関数に渡された場合のみです。あなたのコードはと同等です

replacement = Date.strptime('\1',"%d.%m.%y").strftime("%A").to_s + ' night'
r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei, replacement)

したがって'\1'、有効な日付ではないため、「置換」は機能しません。gsub 置換は、strftime関数によって返される文字列にのみ適用されます。ただし、一致するグループが自動的に設定されるマジックマッチ変数を使用できます。

r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei) {
  Date.strptime($1,"%d.%m.%y").strftime("%A").to_s + ' night'
}

引数$1の代わりに書いたことに注意し\1てくださいstrptime

于 2012-05-07T20:03:18.800 に答える