2014-10-02 83 views
0

我有一個字符串,其中包含一堆函數調用。我需要提取每次出現的VariableSet函數調用。函數可以以任何順序出現。這裏有一個例子:正則表達式從文本中提取圖案

parsedExpression = "VariableSet(b, 999)If(a = 0,"Black",SetColor(a,b,c))VariableSet("a" ,1.573) VariableSet( c,-2387)" 

我需要找到所有以「VariableSet(」上方開始,用它後面的第一個右括號結束,因此,對於例如比賽,我需要一個列表是這樣的:

VariableSet(b, 999) 
VariableSet("a" ,1.573) 
VariableSet( c,-2387) 

我打算用下面的代碼,但我一直沒能確定正確的正則表達式我能想出的最好的是「VariableSet(*(我:?)\ b)」。但它不會產生上述列表。

Dim matches As MatchCollection = Regex.Matches(parsedExpression, "VariableSet\(.*(?i:\)\b)") 

' Loop over matches. 
For Each m As Match In matches 
    ' Loop over captures. 
    For Each c As Capture In m.Captures 
    Dim varName As String = "" 
    Dim varValue As String = "" 
    Dim firstCommaPosition As Integer 

    'For every VariableSet that was found do the following: 
    'Parse the captured string to get the variable name and value 
    varName = c.Value.Replace("VariableSet(", "").Replace(")", "") 
    firstCommaPosition = varName.IndexOf(",") 
    varValue = varName.Substring(firstCommaPosition + 1) 
    varName = varName.Substring(0, firstCommaPosition).Replace("""", "") 

    'Set the variable 
    ce.Variables(varName) = ce.Evaluate(varValue) 

    'Remove this instance of VariableSet() function from parsedExpression 
    parsedExpression = parsedExpression.Replace(c.Value, "") 
    Next 
Next 

如果有人能夠提供正確的正則表達式模式,我將不勝感激。

+1

也許這'VariableSet \([^)] * \)' – sln 2014-10-02 16:53:35

+0

哇,我砍了幾個小時,然後用一種只需幾分鐘即可完成的模式回覆!非常感謝! – ESS 2014-10-02 17:15:26

回答

0

也許這將幫助你:

Dim strMatch As String = "" 
    Dim strVar1 As String = "" 
    Dim strVar2 As String = "" 
    Dim strExpression As String = "VariableSet(b, 999)If(a = 0,""Black"",SetColor(a,b,c))VariableSet(""a"" ,1.573) VariableSet( c,-2387)" 

    Dim rx As New RegularExpressions.Regex("VariableSet\((?<V1>.*?),(?<V2>.*?)\)", RegularExpressions.RegexOptions.IgnoreCase) 
    Dim rxMatch As RegularExpressions.MatchCollection = rx.Matches(strExpression) 
    For intI As Integer = 0 To rxMatch.Count - 1 
     strMatch = rxMatch(intI).Value     'VariableSet(b, 999) 
     strVar1 = rxMatch(intI).Groups("V1").ToString 'b 
     strVar2 = rxMatch(intI).Groups("V2").ToString ' 999 
    Next 
+0

感謝Dan的模式以及使用結果的代碼!我在這裏學到了新東西。你的解決方案對我的混亂是一個巨大的改進。 – ESS 2014-10-02 18:55:34

0

VariableSet\([^)]*\)應該是直接替換。
如果你想變得有趣,所有的代碼可以使用一個正則表達式來完成。

# VariableSet\((\s*"?\s*([^,")]*?)\s*"?\s*(?:,\s*"?\s*([^,")]*?)\s*"?\s*)?)\)  

VariableSet 
\(     # Open paren 
(      # (1 start), Inside paren's 
     \s* 
     "? \s* 
     ([^,")]*?)   # (2), Var 
     \s* 
     "? \s* 
     (?: 
      ,      # Comma 
      \s* 
      "? \s* 
      ([^,")]*?)   # (3), Value 
      \s* 
      "? \s* 
    )? 
)      # (1 end) 
\)      # Close paren 

實施例的輸入字符串:

VariableSet(b, 999) 
VariableSet("a" ,1.573) 
VariableSet( c,-2387) 
VariableSet(, 999) 
VariableSet("aadsfasdf") 
VariableSet( ) 

輸出匹配(VAR /值):

** Grp 2 - (pos 12 , len 1) 
b 
** Grp 3 - (pos 16 , len 3) 
999 
---------------- 
** Grp 2 - (pos 35 , len 1) 
a 
** Grp 3 - (pos 40 , len 5) 
1.573 
---------------- 
** Grp 2 - (pos 63 , len 1) 
c 
** Grp 3 - (pos 65 , len 5) 
-2387 
---------------- 
** Grp 2 - (pos 86 , len 0) EMPTY 
** Grp 3 - (pos 88 , len 3) 
999 
---------------- 
** Grp 2 - (pos 108 , len 9) 
aadsfasdf 
** Grp 3 - NULL 
---------------- 
** Grp 2 - (pos 136 , len 0) EMPTY 
** Grp 3 - NULL 
+0

感謝您的回答! – ESS 2014-10-02 18:52:19