2014-03-14 46 views
0

我有一個字符串,它包含帶有Guid的常規SQL語句。該語句應該進行轉換,以便我可以針對無法處理Guid的本地SQLite數據庫運行它,如.NET框架所述。 因此,我必須將它們轉換爲它們的二進制表示形式,這意味着SQLite中的Guid(在SQL中)'00000000-0000-0000-0000-000000000000'將變爲X'0000000000000000000000000000'或'FE334797-0A46-468D-91F2- 0005F1EC67EC'將變成X'974733fe460a8d4691f20005f1ec67ec'。查找用正則表達式替換Guid與二進制等價物

到單一的Guid轉換的方法如下:

private static string GetBinaryGuid(Guid guidToConvert) 
{ 
    var guidBytes = guidToConvert.ToByteArray(); 
    var guidBinary = new StringBuilder(); 
    foreach (var guidByte in guidBytes) 
    { 
     guidBinary.AppendFormat(@"{0}", guidByte.ToString("x2")); 
    } 
    return guidBinary.ToString(); 
} 

找到真正的Guid(S)的查詢字符串的方法是:

resultString = Regex.Replace(subjectString, @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b", "'$0'", RegexOptions.IgnoreCase); 

我的問題是如何用它們各自的二進制等價物替換字符串中的「真實」Guid(s)?

編輯:只是爲了澄清。我想獲取字符串中的所有Guid,將找到的Guid傳遞給上面提到的方法,並在字符串中替換它。 結果應該是帶有二進制Guid(s)的SQL查詢,如果在字符串中找到的話。

EDIT2:

SELECT * FROM table WHERE Id = 'FE334797-0A46-468D-91F2-0005F1EC67EC' 

應該成爲

SELECT * FROM table WHERE Id = X'974733fe460a8d4691f20005f1ec67ec' 

EDIT3:

@aelor讓我正確的方向。 對於我的具體情況,可以找到解決方案here

+0

SQL字符串是完全隨意的,還是會始終以某種已知的形式? – eggyal

+0

否。查詢字符串可以包含任意數量的Guid(s)。甚至沒有 – KingKerosin

+0

爲什麼不簡單地將GUID存儲爲字符串?除了節省少量的存儲空間之外,轉換爲二進制形式存儲有什麼好處(大概只有在數據檢索時才轉換回字符串形式)?如果你絕對*必須*轉換數據,爲什麼不在SQLite中這樣做(例如,使用觸發器來寫入和讀取視圖)? – eggyal

回答

1

我知道這是非常大的,但是,這是我能想出:

\b([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})-([A-F0-9]{2})([A-F0-9]{2})-([A-F0-9]{2})([A-F0-9]{2})-([A-F0-9]{2})([A-F0-9]{2})-([A-F0-9]{12})\b 

使用這一點,你會得到你的結果匹配組。

替換字符串看起來像這樣:

X'\4\3\2\1\6\5\8\7\9\10\11' 

使用\L爲使其小寫\

Demo here

如果您遇到了問題是這樣的:

'X'974733FE460A91F20005F1EC67EC'' 

您可以輕鬆刪除領先的a nd尾隨'使用函數

public class Main { 
    /** 
    * Remove the leading and trailing quotes from <code>str</code>. 
    * E.g. if str is '"one two"', then 'one two' is returned. 
    * 
    * 
    * @return The string without the leading and trailing quotes. 
    */ 
    static String stripLeadingAndTrailingQuotes(String str) 
    { 
     if (str.startsWith("\'")) 
     { 
      str = str.substring(1, str.length()); 
     } 
     if (str.endsWith("\'")) 
     { 
      str = str.substring(0, str.length() - 1); 
     } 
     return str; 
    } 

} 
+0

太棒了。這幾乎是我想要的。但我還需要替換單個配額:'Guid-Value' - > X'Binary-Value'。這怎麼可能被添加? – KingKerosin

+0

可以請你詳細說明我沒有得到它,你談論的引號 – aelor

+0

[SQL不是一種常規語言](http://stackoverflow.com/a/5639859),所以不能用正則表達式解決這個問題。 – eggyal