正则表达式如何根据行的开头匹配整行?

时间:2013-04-11 13:11:11

标签: c# regex

所以我有SQL文件,我想找到setvars 该文件如下所示:

...  
:setvar DatabaseName "Database_1"  
...  
:setvar DefaultDataPath ""  

我处于此状态"(?m)^:setvar " + variable的模式,其中变量应为“DatabasseName”或“DefaultDataPath”。但该行的结尾不在匹配的Value属性中。 我也尝试了这个:"(?m)^:setvar " + variable + ".+\"$"但它甚至不匹配:)

感谢您的帮助,
彼得

2 个答案:

答案 0 :(得分:3)

尝试:setvar\s+(?<variable>\w*)\s+"?(?<value>\w*)"? - 这将解析每一行,并为您提供一个包含变量和每个匹配值的命名组。

打破它:

  • :setvar找到以“:setvar”开头,后跟一个或多个空格的字符串部分。
  • (?<variable>\w*)获取“setvar”后面的非空格字符,并将它们解析为命名组“variable”
  • "?(?<value>\w*)"?获取变量后面的非空白字符,并将它们解析为命名组“value”。每边的“?”使引号可选。
  • \s+(多次出现)允许一个或多个空格从变量和值中分离setvar。

所以使用这段代码:

var findSetvars = new Regex(@":setvar\s+(?<variable>\w*)\s+""?(?<value>\w*)""?");
var matches = findSetvars.matches(input);

您将在MatchCollection中获得matches,可以通过以下方式进行枚举:

foreach(Match match in matches)
{
   var variable = match.Groups["variable"];
   var value = match.Groups["value"];
   // now do whatever. 
}

请注意,Regex.MatchCollection是.net 1.0样式对象集合之一,因此您必须告诉编译器它的每个成员都是Match对象。非常烦人,希望他们能将其换成一般的比赛列表。 match.Groups["groupname"]的结果将是该组捕获的字符串。

答案 1 :(得分:0)

尝试这种模式。

(\:setvar)\s+(?<variable_name>\S+)\s+"?(?<variable_value>.*)"?

使用此输入

...  
:setvar DatabaseName "Database_1"  
...  
:setvar DefaultDataPath ""  
...
:setvar IntVariable 24