-1

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

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

我在这种状态"(?m)^:setvar " + variable下的模式应该是例如“DatabasseName”或“DefaultDataPath”。但是行尾不在匹配的 Value 属性中。我也试过这个:"(?m)^:setvar " + variable + ".+\"$"但它甚至不匹配:)

感谢您的帮助,
彼得

4

2 回答 2

3

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

分解它:

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

所以使用这段代码:

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

你会得到一个可以像这样枚举的MatchCollectionin :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"]将是该组捕获的字符串。

于 2013-04-11T13:26:34.797 回答
0

试试这个模式。

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

有了这个输入

...  
:setvar DatabaseName "Database_1"  
...  
:setvar DefaultDataPath ""  
...
:setvar IntVariable 24
于 2013-04-11T13:31:12.927 回答