Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 如何从提供的字符串中获取脚本类型、所有者anme和对象名称?_C#_Regex - Fatal编程技术网

C# 如何从提供的字符串中获取脚本类型、所有者anme和对象名称?

C# 如何从提供的字符串中获取脚本类型、所有者anme和对象名称?,c#,regex,C#,Regex,我可以 过程dbo.\u ws\u CallLogs\u DeleteAll 或 表[dbo].[CachedPlan] 或 查看[测试][MyView] 或 函数[xyz]。[ParseStringList] 作为输入 输出应该是 案例1 案例2 案例3 案例4 如何操作?如果输入格式相同,则可以使用此正则表达式 (?<type>PROCEDURE|TABLE|VIEW|FUNCTION)\s+\[?(?<name>\w+)\]?[.]\[?(?<object&g

我可以

过程dbo.\u ws\u CallLogs\u DeleteAll 或

表[dbo].[CachedPlan] 或

查看[测试][MyView] 或

函数[xyz]。[ParseStringList] 作为输入

输出应该是

案例1

案例2

案例3

案例4


如何操作?

如果输入格式相同,则可以使用此正则表达式

(?<type>PROCEDURE|TABLE|VIEW|FUNCTION)\s+\[?(?<name>\w+)\]?[.]\[?(?<object>\w+)\]?

下面是解析它的另一种方法:

static void Main(string[] args)
{
    var parser = new TSql100Parser(true);
    IList<ParseError> errors = new List<ParseError>();
    using (TextReader r = new StreamReader("sql.txt"))
    {
        var result = parser.GetTokenStream(r, errors);
        var results = result
            .Select((i, index) => (i.TokenType == TSqlTokenType.Create) ? index : -1)
            .Where(i => i >= 0)
            .Select(i => result.Skip(i + 1).TakeWhile(j =>
                (j.TokenType == TSqlTokenType.WhiteSpace
                || j.TokenType == TSqlTokenType.QuotedIdentifier
                || j.TokenType == TSqlTokenType.Identifier
                || j.TokenType == TSqlTokenType.Dot
                || j.TokenType == TSqlTokenType.Table
                || j.TokenType == TSqlTokenType.Procedure
                || j.TokenType == TSqlTokenType.View
                || j.TokenType == TSqlTokenType.Function
                ))
                .Where(j => (j.TokenType != TSqlTokenType.WhiteSpace 
                    && j.TokenType != TSqlTokenType.Dot))
                );

        foreach (var item in results)
        {
            var type = item.Where(i => (i.TokenType != TSqlTokenType.QuotedIdentifier
                || i.TokenType != TSqlTokenType.Identifier));
            Console.WriteLine("Type: {0}\tDbo: {1}\tObject: {2}",
                type.First().Text,
                type.Skip(1)
                    .Take(type.Count() - 2)
                    .Aggregate<TSqlParserToken, string>("", 
                        (a, b) => a + ((a == "") ? "" : ".") + b.Text),
                type.Last().Text);
        }
    }
}

我尝试将输入设置为var input=PROCEDURE dbo;但它正在以同样的方式到来blank@priyanka.sarkar现在试试看..我猜您在字符串之前使用了@,因此\n被转义,而不是[,]@priyanka.sarkar ohh..我的错,我忘了为objectname添加[]…请查看编辑..您想让我们为您编码吗?你试过什么?您是否最好使用SQL分析库。。。等等,为什么要解析SQL?您不能拥有过程fooProc、表[dbo].[otherSchema].[Tablename]和视图吗`
string Type = VIEW
string DBOName = test
string obejctName = MyView 
string Type =  FUNCTION
string DBOName = xyz
string obejctName = ParseStringList
(?<type>PROCEDURE|TABLE|VIEW|FUNCTION)\s+\[?(?<name>\w+)\]?[.]\[?(?<object>\w+)\]?
Match m=Regex.Match(input,regex,RegexOptions.IgnoreCase);
m.Groups["type"].Value;//type
m.Groups["name"].Value;//name
m.Groups["object"].Value;//object
static void Main(string[] args)
{
    var parser = new TSql100Parser(true);
    IList<ParseError> errors = new List<ParseError>();
    using (TextReader r = new StreamReader("sql.txt"))
    {
        var result = parser.GetTokenStream(r, errors);
        var results = result
            .Select((i, index) => (i.TokenType == TSqlTokenType.Create) ? index : -1)
            .Where(i => i >= 0)
            .Select(i => result.Skip(i + 1).TakeWhile(j =>
                (j.TokenType == TSqlTokenType.WhiteSpace
                || j.TokenType == TSqlTokenType.QuotedIdentifier
                || j.TokenType == TSqlTokenType.Identifier
                || j.TokenType == TSqlTokenType.Dot
                || j.TokenType == TSqlTokenType.Table
                || j.TokenType == TSqlTokenType.Procedure
                || j.TokenType == TSqlTokenType.View
                || j.TokenType == TSqlTokenType.Function
                ))
                .Where(j => (j.TokenType != TSqlTokenType.WhiteSpace 
                    && j.TokenType != TSqlTokenType.Dot))
                );

        foreach (var item in results)
        {
            var type = item.Where(i => (i.TokenType != TSqlTokenType.QuotedIdentifier
                || i.TokenType != TSqlTokenType.Identifier));
            Console.WriteLine("Type: {0}\tDbo: {1}\tObject: {2}",
                type.First().Text,
                type.Skip(1)
                    .Take(type.Count() - 2)
                    .Aggregate<TSqlParserToken, string>("", 
                        (a, b) => a + ((a == "") ? "" : ".") + b.Text),
                type.Last().Text);
        }
    }
}
using Microsoft.Data.Schema.ScriptDom.Sql;
using Microsoft.Data.Schema.ScriptDom;