Let us assume I have a string like this:
593 578 xxx 38 sss 384 KKK 44
OR
593-578-xxx-38-sss-384-KKK-44 (patterns separated by hyphen or minus)
The string has random numbers and some patterns like xxx, sss and KKK. I want to extract the patterns only from the string. Like,
xxx
sss
KKK
There two different ways you can do this.
1) Create RegExp Object
In the 1st method I’ll use the CreateObject() method to create a RegExp object.
Option Explicit Private Sub getPattern() Dim rE As Object, str As String Set rE = CreateObject("VBScript.RegExp") ' Create object. With rE .IgnoreCase = True .Global = True .Pattern = "([a-zA-Z])\1+" ' Assign a regex pattern. End With str = "593 578 xxx 38 sss 384 KKK 44" ' The string to look for the patterns. ' For the matching patterns. Dim myMatches As MatchCollection Dim myMatch As Match Set myMatches = rE.Execute(str) ' Execute the string ' Print the patterns from the string. For Each myMatch In myMatches Debug.Print myMatch.Value Next End Sub
Output
2) Add Regular Expressions 5.5 Reference
In the 2nd method, we’ll add a "reference" of Regular Expressions in our VBA project to access methods and properties.
Therefore, 1st add a reference.
In your VBA editor, select Tools from the top menu and click References.
Find Microsoft VBScript Regular Expressions 5.5 library, select it (or check it) and press OK.
Here’s the macro to extract patterns from string.
Option Explicit Private Sub getPattern() Dim str As String str = "593 578 xxx 38 sss 384-KKK-44" ' The string with the patterns Dim rE As regExp Set rE = New regExp Dim myMatches As MatchCollection Dim myMatch As Match With rE .IgnoreCase = True .Global = True .Pattern = "([a-zA-Z])\1+" ' Assign a regex pattern. End With Set myMatches = rE.Execute(str) ' Execute the string For Each myMatch In myMatches Debug.Print myMatch.Value Next End Sub
Same result, but different methods.
The methods may be different; however, the RegEx pattern is similar in both the examples.
.Pattern = "([a-zA-Z])\1+"
Let me explain RegExp.
• ([a-zA-Z]): It’s a range for both lower and upper case alphabets from a to z. We are looking for alphabets.
• \1+: Matches and returns the result in a "group". (if you remove this pattern, it will return values separately)
Note: You can test regular expressions here.