![]() |
|
#1
|
|||
|
|||
![]()
Batman1,
Very interesting. After studying your last (which works perfectly), I thought I would modify slightly just to confirm my understanding. The result is a little simpler for me to understand and will provide notes for myself should I ever need to revisit. Thanks again for your lessons in RegEx: Code:
Sub RegExPsuedoLookBack() Dim RegEx As Object, Matches As Object, Match As Object Dim oRng As Range 'Sample document text: Jack Sprat, Johnny Sprat, Tom Sprat, Mary Sprat and Bill Sprat. 'With RegEx look ahead, you can find all instances of x = "Sprat" preceded by either y = "Jack " or y = "Tom " Set RegEx = CreateObject("VBScript.RegExp") With RegEx .Global = True .Pattern = "(?=Tom|Jack)\S+ Sprat" End With Set Matches = RegEx.Execute(ActiveDocument.Range.Text) For Each Match In Matches 'Returns all instances of "Sprat" immediately after "Tom " or "Jack ". Debug.Print Match.Value 'Notice the match return includes the proceeding y qualifyer. Next 'A RegEx look back will return all instances of x = "Sprat" preceded by y = "Jack " or y = "Tom " but the match return only inclues the x value "Sprat" Set RegEx = CreateObject("VBScript.RegExp") With RegEx .Global = True .Pattern = "(?<=Tom |Jack )\Sprat" End With On Error GoTo lbl_EH Set Matches = RegEx.Execute(ActiveDocument.Range.Text) For Each Match In Matches 'If this worked, it would return all instances of "Sprat" immediately after "Tom " or "Jack ". Debug.Print Match.Value Next lbl_ER: 'VBA workaround for RegEx look back. With RegEx .Global = True 'Use a modified look ahead as demonstrated previously. .Pattern = "((?=Tom|Jack)\S+ )Sprat" 'Note the addition of parens "()" around the y element will result in a submatch. End With Set Matches = RegEx.Execute(ActiveDocument.Range.Text) For Each Match In Matches 'Returns x = "Jack Sprat" and "Tom Sprat" matches at before. 'However, also returns the submatches "Jack " from the "Jack Sprat" match and "Tom " from the "Tom Sprat" match. 'Use these manipulate the returned range to achieve a VBA pseudo lookback method. ActiveDocument.Range(Match.FirstIndex + Len(Match.Submatches(0)), Match.FirstIndex + Match.Length).HighlightColorIndex = wdBrightGreen Next lbl_Exit: Exit Sub lbl_EH: MsgBox "Unfortunatley RegEx look back is not supported in VBA." & vbCr + vbCr _ & "Proceding to work around.", vbInformation + vbOKOnly, "INVALID OPERATION" Resume lbl_ER End Sub Please feel free to further comment, if my notes above could be clarified further. |
#2
|
|||
|
|||
![]() Quote:
With Backreferences: 1. You can use submatch 2. You can refer to an earlier group later in the Pattern () 3. You can use submatch in REPLACE Note 1. You already use it in your code. Note 2. Pattern = "([A-Za-z]+) \1" Pattern = <series1><space><series2>, where <series1> and <series2> are identical E.g. Pattern = "([A-Za-z]+) \1" will find "a a", "John John". If .IgnoreCase = True then it will also find "A a" a Pattern = "([A-Za-z]+) ([A-Za-z]+) \2 \1" will find "Jack Sprat Sprat Jack Note 3. In Repace we don't use \1, \2, … We use $1, $2, … Code:
Sub test2() Dim RegEx As Object, Matches As Object, Match As Object, text As String text = "Fellow John John is a good student. Fellow Jack Jack also" Debug.Print text Set RegEx = CreateObject("VBScript.RegExp") With RegEx .Global = True .Pattern = "([A-Za-z]+) \1" If .test(text) Then text = .Replace(text, "$1") ' in every place in string Text where a result is found, that result is replaced with its $1 Debug.Print text End If End With text = "John Smith is a good student. Jack Sprat also" With RegEx .Global = True .Pattern = "([A-Z][a-z]+) ([A-Z][a-z]+)" If .test(text) Then text = .Replace(text, "$2 $1") Debug.Print text End If End With End Sub |
![]() |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Any work-around for this challenge | RRB | Word | 6 | 08-22-2023 11:47 AM |
Formula challenge 3 criteria | JMC44 | Excel Programming | 0 | 04-04-2015 07:38 PM |
![]() |
e.roberts | Office | 3 | 07-13-2012 01:36 AM |
![]() |
gbaker | Excel Programming | 11 | 06-22-2012 09:39 AM |
![]() |
jpotter2 | Word | 3 | 03-22-2011 02:07 PM |