1

サブストリングの各セクション内にハイフンを挿入して、UUIDを適切に準拠したUUIDにしようとしています。

test = "CB13DBB20A9945CC86F11914C979C761"
#The first one will return '----' so essentially the $1 to $5 are returned as emptys
test.sub(/(\h{8})(\h{4})(\h{4})(\h{4})(\h{12})/, "#{$1}-#{$2}-#{$3}-#{$4}-#{$5}")
#Returns the ideal result of CB13DBB2-0A99-45CC-86F1-1914C979C761
test.sub(/(\h{8})(\h{4})(\h{4})(\h{4})(\h{12})/, "#{$1}-#{$2}-#{$3}-#{$4}-#{$5}")

ご覧のとおり、関数の最初の実行は機能しませんが、2番目の実行は機能します。どんなアイデアでも素晴らしいでしょう。追加情報として、

test.match(/(\h{8})(\h{4})(\h{4})(\h{4})(\h{12})/){|m| "#{$1}-#{$2}-#{$3}-#{$4}-#{$5}"}

代わりに初めて動作します。一重引用符と二重引用符は何にも影響しません。

4

4 に答える 4

4

これは正規表現を使用して実現できますが、サブストリングを使用します。

require 'pp'

uuid = 'CB13DBB20A9945CC86F11914C979C761'
pp [uuid[0, 8], uuid[8, 4], uuid[12, 4], uuid[16, 4], uuid[20, 12]]
# => ["CB13DBB2", "0A99", "45CC", "86F1", "1914C979C761"]

puts [
  uuid[0, 8], uuid[8, 4], uuid[12, 4], uuid[16, 4], uuid[20, 12]
].join('-')
# => CB13DBB2-0A99-45CC-86F1-1914C979C761

オフセットと長さの使用は、そのコードを書くときに少し面倒になる可能性があるため、unpack長さのみを使用した別の使用法を次に示します。

lengths = [8, 4, 4, 4, 12]
uuid.unpack(lengths.map{ |l| "a#{ l }" }.join).join('-')
# => "CB13DBB2-0A99-45CC-86F1-1914C979C761"
于 2012-11-20T15:56:41.377 に答える
3

このように一致するパターンを参照してください。

test.sub(/(\h{8})(\h{4})(\h{4})(\h{4})(\h{12})/, '\1-\2-\3-\4-\5')

この動作が見られる理由は、RubyDocsで説明されています。

置換が文字列の場合、一致したテキストに置き換えられます。これには、\ d(dはグループ番号)または\ k(nはグループ名)の形式のパターンのキャプチャグループへの逆参照が含まれる場合があります。二重引用符で囲まれた文字列の場合は、両方の後方参照の前に追加の円記号を付ける必要があります。ただし、置換内では、&$などの特別な一致変数は現在の一致を参照しません

于 2012-11-20T15:36:59.627 に答える
1

あなたの例では、$ 1 ... $ 5は、置換に文字列で置換されます。

置換中にそれらを評価する場合は、代わりにブロック形式を使用してください。

test.sub(/(\h{8})(\h{4})(\h{4})(\h{4})(\h{12})/) { "#{$1}-#{$2}-#{$3}-#{$4}-#{$5}" }
于 2012-11-20T15:37:06.097 に答える
0

FWIW、Rubyにはuuidを提供するSecureRandomがあります

require 'securerandom'
p SecureRandom.uuid #"dd1f58f8-8c42-47e0-9c08-a8d5c191c9c3"

ひもを細かく切るのは簡単ですString#unpack

test = "CB13DBB20A9945CC86F11914C979C761"
p test.unpack("A8A4A4A4A8").join('-') #"CB13DBB2-0A99-45CC-86F1-1914C979"
于 2012-11-20T17:13:54.183 に答える