1

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

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

4 回答 4

6

与此正则表达式一起使用singlelineignorecase选项

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

(?<!\/\/)检查//之前tcquery

.*?是一个懒惰地匹配 0 到多个字符。如果使用.*then 它将匹配最后一个tcqurey跳过的 ibetweentcquery匹配项

\b是一个non-word边界。这允许我们匹配单独的单词

\s匹配空间,0可以many是任何[\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();
于 2012-11-05T16:14:01.650 回答
2

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

^tcquery.*$

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

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

^\s*tcquery.*$

如果您有可以以tcquery但不一定遵循您指定的格式的行,您可以使用以下方式更新模式:

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

要将行的“动态”内容部分匹配到组中,您应该能够使用:

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

另外,值得注意的是,您应该为我上面的每个示例启用忽略大小写正则表达式选项。

于 2012-11-05T16:13:09.190 回答
0
([^\/\/])tcquery (.*) alias \"(.*)\" new$/i

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

([^\/\/])TcQuery (.*) Alias \"(.*)\" New$
于 2012-11-05T16:18:34.177 回答
0

尝试这个:

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

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

于 2012-11-05T16:19:32.540 回答