与模式匹配的正则表达式线

时间:2012-11-05 16:10:21

标签: c# regex

我想要一个正则表达式模式来匹配文本文件中具有以下模式的所有行:

TcQuery {dynamic_content} Alias "{dynamic_content}" New

如果文本文件包含以下两行:

//tcquery c_query alias "qrybklog" new           <= This one shouldn´t be found because there is two backslashes before TcQuery.

tcquery c_query alias "qrybklog" new             <= I want a pattern to match this line

我试过了,但这两行匹配:

        var prw = System.IO.File.ReadAllText(@"d:\backlog.prw", Encoding.ASCII);

        prw = "//TcQuery c_query Alias teste1 new";
        prw = "\nTcQuery c_query Alias teste2 new";
        prw = "\nTcQuery c_query Alias teste3 new";
        prw = "\n//TcQuery c_query Alias teste4 new";
        var regexTcQuery = new Regex("TcQuery+[ *]+[0-9a-zA-Z_]+[ *]+alias+[ *]+[0-9a-zA-Z_\"]+[ *]new$", RegexOptions.IgnoreCase);

        var resultTcQuery = regexTcQuery.Matches(prw);

4 个答案:

答案 0 :(得分:6)

在此正则表达式中使用singlelineignorecase选项

(?<!\/\/)\s*?\btcquery\b(.*?)\balias\b.*?new

(?<!\/\/)//

之前检查tcquery

.*?是一个懒惰的匹配0到多个字符。如果您使用.*,那么它将与tcqurey匹配之间的tcquery跳过匹配

\b是一个non-word边界。这样我们就可以匹配不同的单词

\s0many空间匹配,可以是[\n\r\t\f]

中的任何一个

如果您想获取c_query文本,可以执行此操作

List<string> lst=Regex.Matches(input,@"(?<!\/\/)\s*?\btcquery\b(.*?)\balias\b.*?new").Cast<Match>().Select(x=>x.Groups[1].Value).ToList();

答案 1 :(得分:2)

如果您想匹配整行(没有任何子组),您可以使用:

^tcquery.*$

^表示文本从字符串的开头开始;由于tcquery是紧随其后的文字,因此将忽略以//开头的行。

如果tcquery之前有任何空格,您可以将其与\s*匹配:

^\s*tcquery.*$

如果您的行可以以tcquery开头,但不一定遵循您指定的格式,则可以使用以下内容更新模式:

^\s*tcquery.*alias.*new.*?$

要将这些行的“动态”内容部分与组匹配,您应该可以使用:

^\s*tcquery\s+(.*)\s+alias\s+"(.*)"\s+new.*?$

另外,值得注意的是,您应该为我的每个示例启用ignore-case regex选项。

答案 2 :(得分:0)

([^\/\/])tcquery (.*) alias \"(.*)\" new$/i

如果您的语言不支持/ i进行无壳匹配,请将正则表达式切换为:

([^\/\/])TcQuery (.*) Alias \"(.*)\" New$

答案 3 :(得分:0)

试试这个:

^tcquery [^ ]+ alias "[^"]+" new

这是业余爱好者,但主要思想是该行必须以tcquery开头。