2013-04-11 82 views
-1

所以我有SQL文件,我想找到setvars。
文件看起来是这样的:正则表达式如何匹配基于行首的整行?

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

我在此状态下"(?m)^:setvar " + variable图案,其中的变量应该是例如“DatabasseName”或“DefaultDataPath”。但是该行的结尾并不在比赛的Value属性中。 我想这太:"(?m)^:setvar " + variable + ".+\"$"但它甚至没有匹配:)

感谢您的帮助,
彼得

+1

你可以试试这个 “(M?)^:SETVAR” +变量+ “(+)$”,然后搜索在Match.Groups变量: ) – 2013-04-11 13:17:16

+0

如果您只想检查每行的匹配项,您也可以使用'string.Split()'在尝试匹配任何内容之前预先格式化字符串。 – Nolonar 2013-04-11 13:21:47

+0

你需要检查它是否匹配,或者你需要从字符串中获得价值吗? – rpeshkov 2013-04-11 13:26:03

回答

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); 

你会得到一个在matchesMatchCollection可以通过枚举,像这样:

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"]的结果将是该组捕获的字符串。

+0

请向我解释一下?最后用于?一对^和$有什么问题?谢谢。 – 2013-04-11 13:45:44

+0

The?是使报价可选。 ^和$并不是真正需要的 - 如果有人在一组参数之后或之前放置一些额外的空白空间,它会触发一个错误的否定。 – 2013-04-11 17:39:31

+0

谢谢你的帮助! – 2013-04-11 17:43:54

0

试试这个模式。

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

与该输入

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