C# 使用正则表达式从CREATESQL命令中提取列名
我有这样一个sql命令:C# 使用正则表达式从CREATESQL命令中提取列名,c#,regex,C#,Regex,我有这样一个sql命令: CREATE TABLE Tablex( column1 INT, column2 TEXT, column3 INT, column4 INT, ) 此CREATE命令只是一个示例,可以自由选择列的名称。如何在c#中通过Regx提取列名 我猜我们希望捕获column1和其他类似的列,这个表达式可能会这样做: \s*(.+?)\s+[A-Z]+, 如果它总是从右边用[A-Z]+,绑定 另一种选择是在、之后添加一个空格,在所需列之前添加一个空格: \s
CREATE TABLE Tablex(
column1 INT,
column2 TEXT,
column3 INT,
column4 INT,
)
此CREATE命令只是一个示例,可以自由选择列的名称。如何在c#中通过Regx提取列名 我猜我们希望捕获column1和其他类似的列,这个表达式可能会这样做:
\s*(.+?)\s+[A-Z]+,
如果它总是从右边用[A-Z]+,
绑定
另一种选择是在、
之后添加一个空格,在所需列之前添加一个空格:
\s+(.+?)\s+[A-Z]+,?\s
试验
这是另一个选择。我不喜欢难以维护的复杂正则表达式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication114
{
class Program
{
static void Main(string[] args)
{
string input = "CREATE TABLE Tablex(" +
" column1 INT," +
" column2 TEXT," +
" column3 INT," +
" column4 INT," +
")";
string pattern1 = @"CREATE TABLE Tablex\((?'columns'[^)]+)\)";
Match columnsMatch = Regex.Match(input, pattern1);
string columns = columnsMatch.Groups["columns"].Value.Trim();
string pattern = @"\s*(?'key'[^\s]+)\s+(?'value'\w+)[,$]";
MatchCollection matches = Regex.Matches(columns, pattern);
foreach(Match match in matches.Cast<Match>())
{
Console.WriteLine("Key : '{0}', Value : '{1}'", match.Groups["key"].Value, match.Groups["value"].Value);
}
Console.ReadLine();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Text.RegularExpressions;
命名空间控制台应用程序114
{
班级计划
{
静态void Main(字符串[]参数)
{
string input=“创建表Tablex(”+
“第1列整型,”+
“第2列文本,”+
“第3列INT,”+
“第4列INT,”+
")";
字符串模式1=@“创建表Tablex\((?'columns'[^)]+)\”;
Match columnsMatch=Regex.Match(输入,pattern1);
string columns=columnsMatch.Groups[“columns”].Value.Trim();
字符串模式=@“\s*(?'key'[^\s]+)\s+(?'value'\w+[,$”;
MatchCollection matches=Regex.matches(列、模式);
foreach(在matches.Cast()中匹配)
{
WriteLine(“键:'{0}',值:'{1}',match.Groups[“键”].Value,match.Groups[“值”].Value);
}
Console.ReadLine();
}
}
}
为什么要使用正则表达式?您可以使用GetSchema获取列名,或者通过将结果放入Datatable(使用DataAdapter)然后从Datatable获取列。这是纯文本,我想从这条命令中提取列名。非常感谢您,但如果在C#中进行测试,我会得到以下结果:column1 INT,'在索引29中找到。
我的意思是这里的数据类型INT也带有列名
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication114
{
class Program
{
static void Main(string[] args)
{
string input = "CREATE TABLE Tablex(" +
" column1 INT," +
" column2 TEXT," +
" column3 INT," +
" column4 INT," +
")";
string pattern1 = @"CREATE TABLE Tablex\((?'columns'[^)]+)\)";
Match columnsMatch = Regex.Match(input, pattern1);
string columns = columnsMatch.Groups["columns"].Value.Trim();
string pattern = @"\s*(?'key'[^\s]+)\s+(?'value'\w+)[,$]";
MatchCollection matches = Regex.Matches(columns, pattern);
foreach(Match match in matches.Cast<Match>())
{
Console.WriteLine("Key : '{0}', Value : '{1}'", match.Groups["key"].Value, match.Groups["value"].Value);
}
Console.ReadLine();
}
}
}