我有一个包含带Guids的常规SQL语句的字符串。该语句应该被转换,因此我可以针对本地SQLite数据库运行它,该数据库无法处理.NET-Framework所描述的Guids。 因此我必须将它们转换为二进制表示,这意味着Guid(在SQL中)'00000000-0000-0000-0000-000000000000'将成为SQLite的X'00000000000000000000000000000000'或'FE334797-0A46-468D-91F2-0005F1EC67EC '将成为X'974733fe460a8d4691f20005f1ec67ec'。
转换单个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的方法是:
resultString = Regex.Replace(subjectString, @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b", "'$0'", RegexOptions.IgnoreCase);
我的问题是如何用相应的二进制等效替换字符串中的“真实”Guid?
修改:澄清一下。我想获取字符串中的所有Guid,将找到的Guid传递给上面提到的方法并在字符串中替换它。 结果应该是带有二进制Guid的SQL-Query(如果在字符串中找到。
)EDIT2:
SELECT * FROM table WHERE Id = 'FE334797-0A46-468D-91F2-0005F1EC67EC'
应该成为
SELECT * FROM table WHERE Id = X'974733fe460a8d4691f20005f1ec67ec'
EDIT3:
@aelor给了我正确的方向。 对于我的具体情况,可以找到解决方案here。
答案 0 :(得分: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
将其设为小写。\
如果你遇到这样的麻烦:
'X'974733FE460A91F20005F1EC67EC''
您可以使用函数
轻松删除前导和尾随'
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;
}
}