我想要一个正则表达式模式来匹配具有以下模式的文本文件中的所有行:
TcQuery {dynamic_content} Alias "{dynamic_content}" New
Run Code Online (Sandbox Code Playgroud)
如果文本文件包含以下两行:
//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
Run Code Online (Sandbox Code Playgroud)
我试过这个,但两条线都匹配:
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);
Run Code Online (Sandbox Code Playgroud)
使用singleline和ignorecase选项与此正则表达式
(?<!\/\/)\s*?\btcquery\b(.*?)\balias\b.*?new
Run Code Online (Sandbox Code Playgroud)
(?<!\/\/)检查//之前tcquery
.*?是一个懒惰的匹配0到多个字符.如果你使用.*那么它将匹配最后一次tcqurey跳过tcquery匹配
\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();
Run Code Online (Sandbox Code Playgroud)