如何从大字符串中获取子字符串?

时间:2011-10-04 14:13:57

标签: c#

我有一个查询形式的大字符串,例如: “SELECT column_name1,column_name2,column_name3,column_name4 FROM table1 JOIN table2 ON table1.field1 = table2.field1”(原始查询将有大约30个列名称,来自约6-8个表的连接)

现在我只想要这个字符串中的列名。我怎样才能做到这一点?

提前谢谢。

5 个答案:

答案 0 :(得分:2)

你可以使用正则表达式或一些丑陋的IndexOf东西。基本字符串和/或正则表达式操作。

修改 您可以在http://www.regular-expressions.info/

上找到有关正则表达式的信息

答案 1 :(得分:1)

有许多方法,包括LINQ和RegEx,但这里是一个使用字符串的Split功能的过程。请注意,此循环假定列名称非常单调,并且不会假设列名称中的逗号或空格等特殊情况。

using System;
using System.Collections.Generic;

public class MyClass
{
    public static void Main()
    {
        List<string> columns = new List<string>(); // columns collection

        string sql = "SELECT column_name1, column_name2, column_name3, column_name4 FROM table1 JOIN table2 ON table1.field1 = table2.field1";
        string[] parts = sql.Split(new char[] {' ', ','}, StringSplitOptions.RemoveEmptyEntries);

        for (int i=1; i<parts.Length; i++)
        {
            if (parts[i].Equals("FROM")) break;

            columns.Add(parts[i]); // add cols to collection
        }

        foreach(string column in columns)
            Console.WriteLine(column); // print out the columns
    }
}

答案 2 :(得分:0)

您可以使用正则表达式 - 例如:

string resultString = null;
try {
resultString = Regex.Match(subjectString, "SELECT (.+) FROM", RegexOptions.Singleline  | RegexOptions.Multiline).Value;
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}

答案 3 :(得分:0)

让人惊讶。粗暴的人群。

        string query = "SELECT this, that, there, when, who, what, FROM Words";
        string[] split = query.Split(' ');
        string[] columns = new string[30];

        for (int i = 1; i < split.Length; i++)
        {
            if (split[i].ToUpper() == "FROM")
                break;
            columns[i - 1] = split[i];
        }

答案 4 :(得分:0)

我想也许你会以错误的方式解决这个问题。

如果您自己编写此SQL字符串,那么您已经知道了这些名称,并且应该从某种集合构建您的SQL字符串。

如果您没有编写字符串,那么为什么不从结果集中获取列名?这假设他们当然拥有它们(和别名),并且在执行查询后获得名称并不重要。

如果你需要这样做并且你自己编写这个字符串,那么你需要动态构造查询,以便在数据再次出现时你有一些想法。