Microsoft Office Forums

Go Back   Microsoft Office Forums > >

Closed Thread
 
Thread Tools Display Modes
  #1  
Old 01-06-2025, 09:27 AM
gmaxey gmaxey is offline Regex-pattern Windows 10 Regex-pattern Office 2019
Expert
 
Join Date: May 2010
Location: Brasstown, NC
Posts: 1,601
gmaxey is just really nicegmaxey is just really nicegmaxey is just really nicegmaxey is just really nicegmaxey is just really nice
Default

Quote:
Originally Posted by batman1 View Post
That's right. For example, can you provide a simple pattern in Word Find with the following task: "Find in the sequence all numbers consisting of 4 or 5 digits, whose first 4 digits must have at least 1 digit 2"

batman1,


I suppose the skills that someone is familiar with has bearing on what is simple or not. A simple find pattern? No, and one may not exists. However, with VBA your task is easy enough:



Code:
Sub ScratchMacro()
'A basic Word Macro coded by Gregory K. Maxey
Dim oRng As Range
  Set oRng = ActiveDocument.Range
  With oRng.Find
    .Text = "[0-9]{1,}"
    .MatchWildcards = True
    While .Execute
      Select Case Len(oRng.Text)
        Case 4
          If InStr(oRng.Text, "2") > 0 Then Debug.Print oRng.Text
        Case 5
          If InStr(Left(oRng.Text, 4), "2") > 0 Then Debug.Print oRng.Text
      End Select
    Wend
  End With
lbl_Exit:
  Exit Sub
End Sub
Sample Numbers:
12345 – Match


56789 – No Match
123 – No Match
1234 – Match
4321 – Match
8945 – No Match
98765 – No Match
124567 – No match
54312 – No match
__________________
Greg Maxey
Please visit my web site at http://www.gregmaxey.com/
  #2  
Old 01-06-2025, 11:04 AM
batman1 batman1 is offline Regex-pattern Windows 11 Regex-pattern Office 2013
Advanced Beginner
 
Join Date: Jan 2025
Posts: 57
batman1 is on a distinguished road
Default

Quote:
Originally Posted by gmaxey View Post
batman1,


I suppose the skills that someone is familiar with has bearing on what is simple or not. A simple find pattern? No, and one may not exists. However, with VBA your task is easy enough:

1. There is nothing that says that a number that has 4 or 5 digits has to be a word. So it can be part of a word. Besides, your code will find 3452 in the string "a3452b" (and correctly), so it should find 12456 (1245 also meets the criteria, but we want the longest result possible) in the string "124567".

2. Every case, well almost every case, can be solved in VBA. The only thing is that the solution is relatively short. In the current code, after .Execute you have to use Select.


Besides, if data = "13452234567" the code will not find 34522
  #3  
Old 01-06-2025, 11:16 AM
vivka vivka is offline Regex-pattern Windows 7 64bit Regex-pattern Office 2016
Expert
 
Join Date: Jul 2023
Posts: 293
vivka is on a distinguished road
Default

Or another presentation of Greg's idea:
Code:
Sub ScratchMacro()
'Coded by Gregory K. Maxey
'https://www.msofficeforums.com/184580-post31.html

 Dim oRng As range
  Set oRng = ActiveDocument.range
  With oRng.Find
    .text = "<[0-9]{4,5}>"
    .MatchWildcards = True
    While .Execute
        If InStr(oRng.text, "2") > 0 Then MsgBox oRng.text
    Wend
  End With
lbl_Exit:
  Exit Sub
  End Sub
However I had situations when regex helped me out, unlike VBA. Maybe it was because of my poor VBA knowledge.
Greg and Batman1, thank you for another good lesson!
  #4  
Old 01-06-2025, 11:33 AM
batman1 batman1 is offline Regex-pattern Windows 11 Regex-pattern Office 2013
Advanced Beginner
 
Join Date: Jan 2025
Posts: 57
batman1 is on a distinguished road
Default

Quote:
Originally Posted by vivka View Post
Or another presentation of Greg's idea:
Code:
Sub ScratchMacro()
'Coded by Gregory K. Maxey
'https://www.msofficeforums.com/184580-post31.html

 Dim oRng As range
  Set oRng = ActiveDocument.range
  With oRng.Find
    .text = "<[0-9]{4,5}>"
    .MatchWildcards = True
    While .Execute
        If InStr(oRng.text, "2") > 0 Then MsgBox oRng.text
    Wend
  End With
lbl_Exit:
  Exit Sub
   End Sub
As I explained the number DOES NOT HAVE TO be a word, it can be part of a word.

If the data is:
a3452b
13452
then the code with .text = "[0-9]{4,5}" will find both 3452 and 13452. Meanwhile, the result 13452 is not good because 2 appears in the fifth place and not in 1-4
  #5  
Old 01-06-2025, 12:19 PM
vivka vivka is offline Regex-pattern Windows 7 64bit Regex-pattern Office 2016
Expert
 
Join Date: Jul 2023
Posts: 293
vivka is on a distinguished road
Default

In the code
Code:
<[0-9]{4,5}>
< and > identify a 4- or 5-digit 'word' without any letters. You can test it. As for finding 2 in all positions but fifth, Greg's 2nd condition can be used. So, the final code is:
Code:
Sub ScratchMacro() 
 'Coded by Gregory K. Maxey 
'https://www.msofficeforums.com/184580-post31.html  
 Dim oRng As range   
   Set oRng = ActiveDocument.range   
   With oRng.Find     
     .text = "<[0-9]{4,5}>"     
     .MatchWildcards = True     
     While .Execute         
       If InStr(left(oRng.text, 4), "2") > 0 Then MsgBox oRng.text     
     Wend   
   End With 
lbl_Exit:   
   Exit Sub    
End Sub
However, I repeat that my (not rich) experience shows that there are situations when only regex can be helpful.
  #6  
Old 01-06-2025, 01:15 PM
batman1 batman1 is offline Regex-pattern Windows 11 Regex-pattern Office 2013
Advanced Beginner
 
Join Date: Jan 2025
Posts: 57
batman1 is on a distinguished road
Default

Quote:
Originally Posted by vivka View Post
In the code
Code:
<[0-9]{4,5}>
< and > identify a 4- or 5-digit 'word' without any letters. You can test it. As for finding 2 in all positions but fifth, Greg's 2nd condition can be used. So, the final code is:
Code:
Sub ScratchMacro() 
 'Coded by Gregory K. Maxey 
'https://www.msofficeforums.com/184580-post31.html  
 Dim oRng As range   
   Set oRng = ActiveDocument.range   
   With oRng.Find     
     .text = "<[0-9]{4,5}>"     
     .MatchWildcards = True     
     While .Execute         
       If InStr(left(oRng.text, 4), "2") > 0 Then MsgBox oRng.text     
     Wend   
   End With 
lbl_Exit:   
   Exit Sub    
 End Sub

I have already explained that the task does not require the number to be a word - it can be part of a word.

With data:
13452234567
a3452b
67892
123456 23556789 3456789 a234667 13452234567 a3452b 1342 222

podany kod znajdzie tylko 1342 . Tymczasem wyniki =
34522
3452
7892
12345
23556
23466
34522
3452
1342
  #7  
Old 01-06-2025, 01:24 PM
vivka vivka is offline Regex-pattern Windows 7 64bit Regex-pattern Office 2016
Expert
 
Join Date: Jul 2023
Posts: 293
vivka is on a distinguished road
Default

That's clear as mud. In 13452234567 should the code find 34522 and in 123456 12345 ? Then what is the rule/principle of the search? If "Find in the sequence all numbers consisting of 4 or 5 digits, whose first 4 digits have at least 1 digit 2", then 13452234567 contains 3452, 2345, 23456, correct? Ok, never mind! I'm getting too obsessed with the topic and stressing you with my questions.
Closed Thread



Similar Threads
Thread Thread Starter Forum Replies Last Post
Regex-pattern Capture group in RegEx alex100 Word VBA 1 01-02-2021 02:39 PM
Regex-pattern Regex over 700 matches in a long doc totoMSOF Word VBA 19 03-11-2019 01:28 PM
Regex-pattern Using VB Regex feature, I tried to replace 'the' and 'this' with 'that' but got screwed abdan Word VBA 3 01-18-2019 09:38 PM
Macro help regex subspace3 Word VBA 1 10-15-2014 09:53 AM
Regex in Word: Replaced strings are in disorder chgeiselmann Word 0 04-26-2009 11:33 AM

Other Forums: Access Forums

All times are GMT -7. The time now is 08:37 AM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.
Search Engine Optimisation provided by DragonByte SEO (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.
MSOfficeForums.com is not affiliated with Microsoft