title: RegEx VBA Excel complex string
body: <p>I have a function pulled from <a href="https://excelicious.wordpress.com/code-samples/vba/regex-functions/" rel="nofollow">here</a>.  My problem is that I don't know what RegEx pattern I need to use to split out the following data: </p>
  
  <pre><code>+1 vorpal unholy longsword +31/+26/+21/+16 (2d6+13)
  +1 vorpal flaming whip +30/+25/+20 (1d4+7 plus 1d6 fire and entangle)
  2 slams +31 (1d10+12)
  </code></pre>
  
  <p>I want it to look like:</p>
  
  <pre><code>+1 vorpal unholy longsword, 31 
  +1 vorpal flaming whip, 30 
  2 slams, 31
  </code></pre>
  
  <p>Here is the VBA code that does the RegExp validation:</p>
  
  <pre><code>Public Function RXGET(ByRef find_pattern As Variant, _
                          ByRef within_text As Variant, _
                          Optional ByVal submatch As Long = 0, _
                          Optional ByVal start_num As Long = 0, _
                          Optional ByVal case_sensitive As Boolean = True) As Variant
  ' RXGET - Looks for a match for regular expression pattern find_pattern
  ' in the string within_text and returns it if found, error otherwise.
  ' Optional long submatch may be used to return the corresponding submatch
  ' if specified - otherwise the entire match is returned.
  ' Optional long start_num specifies the number of the character to start
  ' searching for in within_text. Default=0.
  ' Optional boolean case_sensitive makes the regex pattern case sensitive
  ' if true, insensitive otherwise. Default=true.
  
  Dim objRegex As VBScript_RegExp_55.RegExp
  Dim colMatch As VBScript_RegExp_55.MatchCollection
  Dim vbsMatch As VBScript_RegExp_55.Match
  Dim colSubMatch As VBScript_RegExp_55.SubMatches
  Dim sMatchString As String
  
  Set objRegex = New VBScript_RegExp_55.RegExp
  
  ' Initialise Regex object
  With objRegex
      .Global = False
      ' Default is case sensitive
      If case_sensitive Then
          .IgnoreCase = False
      Else: .IgnoreCase = True
      End If
      .pattern = find_pattern
  End With
  
  ' Return out of bounds error
  If start_num &gt;= Len(within_text) Then
      RXGET = CVErr(xlErrNum)
      Exit Function
  End If
  sMatchString = Right$(within_text, Len(within_text) - start_num)
  
  ' Create Match collection
  Set colMatch = objRegex.Execute(sMatchString)
  If colMatch.Count = 0 Then ' No match
      RXGET = CVErr(xlErrNA)
  Else
      Set vbsMatch = colMatch(0)
      If submatch = 0 Then ' Return match value
          RXGET = vbsMatch.Value
      Else
          Set colSubMatch = vbsMatch.SubMatches ' Use the submatch collection
          If colSubMatch.Count &lt; submatch Then
              RXGET = CVErr(xlErrNum)
          Else
              RXGET = CStr(colSubMatch(submatch - 1))
          End If
      End If
  End If
  End Function
  </code></pre>