解析SQL DataType的字符串

时间:2010-01-29 00:28:36

标签: c# string parsing

我正在对生成的LINQ to SQL类(即DataContext)进行一些反思。对于类(表)上的每个属性(列),我得到ColumnAttribute.DbType值。

它可以是各种不同的值,这里有一些例子:

  • Int NOT NULL
  • 内部
  • VARCHAR(255)
  • VarChar(255)NOT NULL

......等等。

如果我想将这些字符串解析成单独的有意义的值,例如“DataType”,“Nullable”和“MaxLength”,那么最好的方法是什么?

我不需要全面的词法分析器/解析器或语言解释器,我认为没有必要像M这样的东西。除了涉及Substring的某些(可怕的)特定手动解析之外,您会推荐什么?

C#中的答案,请 - 这几天我几乎都很好:)

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式来匹配这些模式:

string input = @"
    Int NOT NULL
    Int
    VarChar(255)
    VarChar(255) NOT NULL
    Bit";
foreach (Match m in Regex.Matches(input,
    @"^\s*(?<datatype>\w+)(?:\((?<length>\d+)\))?(?<nullable> (?:NOT )?NULL)?",
    RegexOptions.ECMAScript | RegexOptions.Multiline))
{
    Console.WriteLine(m.Groups[0].Value.Trim());
    Console.WriteLine("\tdatatype: {0}", m.Groups["datatype"].Value);
    Console.WriteLine("\tlength  : {0}", m.Groups["length"  ].Value);
    Console.WriteLine("\tnullable: {0}", m.Groups["nullable"].Value);
}

答案 1 :(得分:1)

这样做,使用如下所示的regexp:

public Regex MyRegex = new Regex(@
      "(?<datatype>([tiny|big]?int|long)?|(?<varchar>varchar)?)\s?"+
      "(\((?<len>\d{1,})\))?\s?(?<nullable>(?<not>not)?\s+(?<null>null))?",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

Match m = MyRegex.Match(InputText);

// Example invocation...
if (m.Success){
  string DataType = m.Groups["datatype"].Value;
  int DataLen = m.Groups["len"].Value;
  string Nullable = m.Groups["nullable"].Value;
}

对于上面的示例,它匹配:

int null
varchar(255) not null

此外,regexp仅匹配tinyint,bigint,int,long和varchar作为示例,以帮助您入门。

希望这有帮助, 最好的祝福, 汤姆。