MartyConnelly
martyconnelly at shaw.ca
Tue May 27 18:13:26 CDT 2003
Martin Reid wrote:
> [a-zA-Z]+\w*\d+\w*"
>
> What does the above regular expression do???
>
>
>
> Martin
Here is a Regular Expression documentor I got permission to use a few
years back
from Don Edwards.
gives you
any of
Followed by a, -, z, A, -, Z one or more times
Followed by word-char zero or more times
Followed by digit one or more times
Followed by word-char zero or more times
' Attribute VB_Name = "mDocumenter"
' 'From: Don Edwards <don.edwards at ci.seattle.wa.us>
' see regexpressions at www.vbxml.com or www.topxml.com
Public Const TestExpr As String = _
"^[\w\-]+(\.[\w\-]{2,})*@[\w\-]+(\.[\w\-]{2,})*$"
Public gtxtPatternDescription As String
Private bForceLine As Boolean
Private bNewline As Boolean
Private bIndent As Boolean
Private bFollowed As Boolean
Private lM As Long
Private lH As Long
Private lPattern As Long
Private sIn As String, sOut As String
'From: Don Edwards <don.edwards at ci.seattle.wa.us>
Sub TestDocReg()
'Debug.Print RegExpD("^[\w\-]+(\.[\w\-]{2,})*@[\w\-]+(\.[\w\-]{2,})*$")
'Debug.Print
RegExpD("^[01]?\s*[\(\.-]?(\d{3})[\)\.-]?\s*(\d{3})[\.-](\d{4})$")
Debug.Print RegExpD("/.//created/@month")
Debug.Print RegExpD("@* | * | pi() | comment() | text()")
End Sub
Private Sub NewLine(ByVal lIndent As Long)
Static lLineStart As Long
If sOut = "" Then Exit Sub
If lLineStart > Len(sOut) Or lLineStart = 0 Then lLineStart = 1
If Trim(Mid(sOut, lLineStart)) = "" Then Exit Sub
If bNewline Then sOut = sOut & vbCrLf
If bIndent And (lIndent > 0) Then sOut = sOut & Space(lIndent)
If bFollowed Then sOut = sOut & "Followed by"
lLineStart = Len(sOut) + 1
bForceLine = False
End Sub
Private Sub AddOn(ByVal sAdd As String, _
ByVal lIndent As Long, Optional ByVal pbForceLine As Boolean = False)
If bForceLine Or pbForceLine Then NewLine lIndent
If Len(sOut) = 0 And Left(sAdd, 1) = " " Then
sAdd = Mid(sAdd, 2)
ElseIf Right(sOut, 1) = " " And Left(sAdd, 1) = " " Then
sAdd = Mid(sAdd, 2)
ElseIf Len(sOut) >= Len(vbCrLf) And Left(sAdd, 1) = " " Then
If Right(sOut, Len(vbCrLf)) = vbCrLf Then
sAdd = Mid(sAdd, 2)
End If
End If
sOut = sOut & sAdd
If Len(sAdd) < Len(vbCrLf) Then
bNewline = True
Else
bNewline = (Right(sAdd, Len(vbCrLf)) <> vbCrLf)
End If
bNewline = True
bIndent = True
bFollowed = True
End Sub
Public Function RegExpD(ByVal rexIn As String) As String
lH = 1
lM = Len(rexIn)
lPattern = 0
sIn = rexIn
sOut = ""
bNewline = True
bFollowed = False
bIndent = True
Debug.Print lH, lM
Do
RegExpD2 0
Loop Until lH > lM
RegExpD = sOut
End Function
Public Sub RegExpD2(ByVal lIndent As Long)
Dim lP As Long
Do Until lH > lM
Select Case Mid(sIn, lH, 1)
Case "^":
AddOn " Start of input", lIndent
lH = lH + 1
bForceLine = True
bNewline = True
Case "$":
AddOn " End of input", lIndent
lH = lH + 1
bForceLine = True
bNewline = True
Case "*":
bForceLine = False
AddOn " zero or more times", lIndent
lH = lH + 1
bForceLine = True
bNewline = True
Case "+":
bForceLine = False
AddOn " one or more times", lIndent
lH = lH + 1
bForceLine = True
bNewline = True
Case "?":
bForceLine = False
AddOn " zero or one times", lIndent
lH = lH + 1
bForceLine = True
bNewline = True
Case ".":
AddOn " any non-newline", lIndent
lH = lH + 1
bNewline = True
Case "(":
lPattern = lPattern + 1
lP = lPattern
lH = lH + 1
AddOn " Pattern-" & CStr(lPattern) & ": (", True
bForceLine = True
bFollowed = False
RegExpD2 lIndent + 4
bFollowed = False
AddOn ")-end-Pattern-" & CStr(lP), lIndent, True
bForceLine = True
bNewline = True
Case ")":
lH = lH + 1
Exit Sub
Case "|":
lH = lH + 1
AddOn " or", lIndent
bNewline = True
Case "{":
bForceLine = False
lH = lH + 1
AddOn " ", lIndent
Do
If lH > lM Then Exit Do
Select Case Mid(sIn, lH, 1)
Case "}":
AddOn " times", lIndent
lH = lH + 1
Exit Do
Case ",":
lH = lH + 1
If Mid(sIn, lH, 1) = "}" Then
AddOn " or more", lIndent
Else
AddOn " to ", lIndent
End If
Case Else:
AddOn Mid(sIn, lH, 1), lIndent
lH = lH + 1
End Select
Loop
bForceLine = True
bNewline = True
Case "[":
lH = lH + 1
If Mid(sIn, lH, 1) = "^" Then
AddOn " any except", lIndent, True
Else
AddOn " any of", lIndent, True
End If
lP = lH
Do
If lH > lM Then Exit Do
If lH <> lP Then
AddOn ",", lIndent
End If
ParseChar lIndent
Loop Until Mid(sIn, lH, 1) = "]"
lH = lH + 1
bForceLine = True
bNewline = True
Case "/":
lH = lH + 1
AddOn " Char-", lIndent, True
Do
If lH > lM Then Exit Do
If Mid(sIn, lH, 1) = "/" Then Exit Do
AddOn Mid(sIn, lH, 1), lIndent
lH = lH + 1
Loop
lH = lH + 1
bNewline = True
Case "\":
ParseChar lIndent
bNewline = True
Case " ": AddOn " space", lIndent
lH = lH + 1
bNewline = True
Case ",": AddOn " comma", lIndent
lH = lH + 1
bNewline = True
Case Else: AddOn " " & Mid(sIn, lH, 1), lIndent
lH = lH + 1
bNewline = True
End Select
Loop
End Sub
Private Sub ParseChar(ByVal lIndent As Long)
Select Case Mid(sIn, lH, 1)
Case "\":
lH = lH + 1
Select Case Mid(sIn, lH, 1)
Case "b": AddOn " word-edge", lIndent
Case "B": AddOn " not-word-edge", lIndent
Case "d": AddOn " digit", lIndent
Case "D": AddOn " not-digit", lIndent
Case "f": AddOn " formfeed", lIndent
Case "n": AddOn " newline", lIndent
Case "r": AddOn " return", lIndent
Case "s": AddOn " whitespace", lIndent
Case "S": AddOn " non-whitespace", lIndent
Case "t": AddOn " tab", lIndent
Case "v": AddOn " vertical-tab", lIndent
Case "w": AddOn " word-char", lIndent
Case "W": AddOn " not-word-char", lIndent
Case "1" To "9": AddOn " Pattern-", lIndent
Do
AddOn Mid(sIn, lH, 1), lIndent
lH = lH + 1
If lH > lM Then Exit Do
If InStr("0123456789", Mid(sIn, lH, 1)) = 0 Then Exit Do
Loop
lH = lH - 1
Case Else:
AddOn " " & Mid(sIn, lH, 1), lIndent
End Select
lH = lH + 1
Case " ": AddOn " space", lIndent
lH = lH + 1
Case ",": AddOn " comma", lIndent
lH = lH + 1
Case Else: AddOn " " & Mid(sIn, lH, 1), lIndent
lH = lH + 1
End Select
End Sub