繁体   English   中英

正则表达式从文本中提取图案

[英]Regex to extract pattern from text

我有一个字符串,其中包含一堆函数调用。 我需要提取每次出现的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(。*(?i:)\\ 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

如果有人可以提供正确的正则表达式模式,我将不胜感激。

也许这会帮助您:

    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

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

输出匹配项(变量/值):

 **  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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM