我正在对生成的LINQ to SQL类(即DataContext)进行一些反思。对于类(表)上的每个属性(列),我得到ColumnAttribute.DbType
值。
它可以是各种不同的值,这里有一些例子:
......等等。
如果我想将这些字符串解析成单独的有意义的值,例如“DataType”,“Nullable”和“MaxLength”,那么最好的方法是什么?
我不需要全面的词法分析器/解析器或语言解释器,我认为没有必要像M这样的东西。除了涉及Substring
的某些(可怕的)特定手动解析之外,您会推荐什么?
C#中的答案,请 - 这几天我几乎都很好:)
答案 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作为示例,以帮助您入门。
希望这有帮助, 最好的祝福, 汤姆。