2013-04-11 87 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