Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式从CREATESQL命令中提取列名_C#_Regex - Fatal编程技术网

C# 使用正则表达式从CREATESQL命令中提取列名

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

我有这样一个sql命令:

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();
        }
    }
}