は、あなたが文字列にファイルを読んでいると行に文字列を分離してから空白を取り除きます各行の端。
arr =<<_.lines.map(&:strip)
<!--#set var="V1" value="HI" -->
<!--#set var="V2" value="THERE" -->
<!--#set var="FV" value="HEY/${V1}/${V2}" -->
_
#=> ["<!--#set var=\"V1\" value=\"HI\" -->",
# "<!--#set var=\"V2\" value=\"THERE\" -->",
# "<!--#set var=\"FV\" value=\"HEY/${V1}/${V2}\" -->"]
次の正規表現を使用します。
r1 =/
(?<=\svar=\") # match ' var="' in a positive lookbehind
.+? # match one or more characters lazily
(?=\") # match '"' in a positive lookahead
/x # free-spacing regex definition mode
r2 =/
(?<=\svalue=\") # match ' value"' in a positive lookbehind
.+? # match one or more characters lazily
(?=\") # match '"' in a positive lookahead
/x # free-spacing regex definition mode
r3 =/
\/\$\{ # match '/${'
\w+ # match one or more word characters
\} # match '}'
/x # free-spacing regex definition mode
r4 =/
(?<=\/\$\{) # match '/${' in a positive lookbehind
.+? # match any number of character, lazily
(?=\}) # match `}` in a positive lookahead
/x # free-spacing regex definition mode
次のようにして、希望の戻り値を計算できます。
g = arr.each_with_object({}) do |s,h|
var = s[r1].strip
value = s[r2].strip
h["\/\$\{#{var}\}"] = value.gsub(r3) { |s| h.key?(s) ? "/#{h[s]}" : "" }
end
#=> {"/${V1}"=>"HI", "/${V2}"=>"THERE", "/${FV}"=>"HEY/HI/THERE"}
最後に、キーを変更します。
g.each_with_object({}) { |(k,v),h| h[k[r4]] = v }
#=> {"V1"=>"HI", "V2"=>"THERE", "FV"=>"HEY/HI/THERE"}
上記の2つの表現はもちろん連鎖することができます。実際、それは1行で書くことができますが、私はそれをお勧めしません。
これはどのくらい面白いですか。少なくとも私の経験の浅い心の中で。私の方法はきれいではありませんでしたが、私はそこに着くことができました。しかし、埋め込み変数リファレンスをどのように置き換えるかはまだ分かりません。 FIRST_VARなどをクリーンな方法で使用します。任意のアイデアやヒントがありますか? – farhany