regular expression parse string Perl $1 VBScript.RegExp

  • Thread starter gimme_this_gimme_that
  • Start date
G

gimme_this_gimme_that

I want to use a VBScript regular expression to parse a string in VBA.

Can some kind soul get this to work?

Thanks.

Sub x()

Dim s As String
s = "First Name: Joe"
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "First Name: (\w+)"
Set Matches = regEx.Execute(s)

' This statement fails - no such property
Set oMatch = Matches.subMatches(0)

' I can enumerate through Matches but the enumeration doesn't include
"Joe"

End Sub
 
R

Ron Rosenfeld

I want to use a VBScript regular expression to parse a string in VBA.

Can some kind soul get this to work?

Thanks.

Sub x()

Dim s As String
s = "First Name: Joe"
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "First Name: (\w+)"
Set Matches = regEx.Execute(s)

' This statement fails - no such property
Set oMatch = Matches.subMatches(0)

' I can enumerate through Matches but the enumeration doesn't include
"Joe"

End Sub


Sub x()
Dim regEx As Object
Dim Matches As Object

Dim s As String
s = "First Name: Joe"
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "First Name: (\w+)"
Set Matches = regEx.Execute(s)

' This statement fails - no such property
' Set oMatch = Matches.subMatches(0)

Debug.Print Matches(0).submatches(0)

End Sub


--ron
 
B

Bernie Deitrick

Ron,

How would you use it to find multiple matches: if

s = "First Name: Joe, First Name: Ron"

your debug.print returns Joe - how do you get to Ron as well?

TIA,
Bernie
 
D

Dana DeLouis

How would you use it to find multiple matches: if
s = "First Name: Joe, First Name: Ron"

Hi Bernie. Try setting the Global search to True.

Sub x()
Dim regEx As Object
Dim Matches As Object
Dim s As String

s = "First Name: Joe, First Name: Ron"

Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "First Name: (\w+)"
regEx.Global = True
regEx.IgnoreCase = True

Set Matches = regEx.Execute(s)

Debug.Print Matches(0).Submatches(0)
Debug.Print Matches(1).Submatches(0)

'or
Dim sName
For Each sName In Matches
Debug.Print sName.Submatches(0)
Next sName
End Sub
 
R

Ron Rosenfeld

Ron,

How would you use it to find multiple matches: if

s = "First Name: Joe, First Name: Ron"

your debug.print returns Joe - how do you get to Ron as well?

TIA,
Bernie

Bernie,

Excerpted From:
http://support.microsoft.com/default.aspx?scid=kb;en-us;818802&Product=vbb

• Global: Sets a Boolean value or returns a Boolean value that indicates
whether a pattern must match all the occurrences in a whole search string, or
whether a pattern must match just the first occurrence.

In my response to the OP, I was just modifying his routine. But, ordinarily I
set the Global property to True, so as to enable multiple matches.

Here's the routine modified, with the changes noted:

==========================================
Option Explicit

Sub x()
Dim regEx As Object
Dim Matches As Object
'-------------------
Dim i As Long
'--------------------
Dim s As String
s = "First Name: Joe First Name: Bernie"
Set regEx = CreateObject("VBScript.RegExp")
'-----------------------
regEx.Global = True
'-----------------------
regEx.Pattern = "First Name: (\w+)"
Set Matches = regEx.Execute(s)

'------------------------------
For i = 0 To Matches.Count - 1
Debug.Print Matches(i).submatches(0)
Next i
'--------------------------------

End Sub
==============================================
--ron
 
R

Ron Rosenfeld

Ron,

How would you use it to find multiple matches: if

s = "First Name: Joe, First Name: Ron"

your debug.print returns Joe - how do you get to Ron as well?

TIA,
Bernie

Bernie,

Excerpted From:
http://support.microsoft.com/default.aspx?scid=kb;en-us;818802&Product=vbb

• Global: Sets a Boolean value or returns a Boolean value that indicates
whether a pattern must match all the occurrences in a whole search string, or
whether a pattern must match just the first occurrence.

In my response to the OP, I was just modifying his routine. But, ordinarily I
set the Global property to True, so as to enable multiple matches.

Here's the routine modified, with the changes noted:

==========================================
Option Explicit

Sub x()
Dim regEx As Object
Dim Matches As Object
'-------------------
Dim i As Long
'--------------------
Dim s As String
s = "First Name: Joe First Name: Bernie"
Set regEx = CreateObject("VBScript.RegExp")
'-----------------------
regEx.Global = True
'-----------------------
regEx.Pattern = "First Name: (\w+)"
Set Matches = regEx.Execute(s)

'------------------------------
For i = 0 To Matches.Count - 1
Debug.Print Matches(i).submatches(0)
Next i
'--------------------------------

End Sub
==============================================
--ron
 
D

Dana DeLouis

Should there be no Names in the string, one test to use is:
If Matches.Count > 0 Then ...

Other articles say it's better to use "Test."
I'm not sure which is faster/better in this case.

Sub Demo()
Dim Matches As Object
Dim s As String
Dim sName

s = "First Name: Joe, First Name: Ron"
'or
s = "Text withe no Names"

With CreateObject("VBScript.RegExp")
.Pattern = "First Name: (\w+)"
.Global = True
.ignorecase = True

If .Test(s) Then
Set Matches = .Execute(s)
For Each sName In Matches
Debug.Print sName.Submatches(0)
Next sName
Else
'No Names
End If
End With
End Sub
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top