使用正则表达式查找并替换Guid为二进制等效项

时间:2014-03-14 09:13:29

标签: c# sql regex sqlite guid

我有一个包含带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

1 个答案:

答案 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将其设为小写。\

Demo here

如果你遇到这样的麻烦:

'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;
  }

}