Visual Basic/正则表达式测试器
这是一个非常小的程序,它证明了有用的程序并不需要很大。当玩弄在维基教科书中包含的源代码的自动下载和构建的想法时,我需要测试一些正则表达式。我在网上搜索现成的工具,但没有找到真正符合我想要做的事情的工具。Eric Gunnerson 的 C# 工具非常好,但依赖于 .NET 库,对于这样一个小的程序来说,这似乎是一个不必要的巨大开销。所以我花了大约 15 分钟自己制作了一个。它就在这里,它只有最基本错误检查,控件没有整齐排列,并且窗体不可调整大小,或者更确切地说,它是可以调整大小的,但控件不能调整大小。它有很多限制,绝对需要改进,请参见练习。
此窗体是程序中唯一的模块。所有困难的工作都由 VBScript 正则表达式库完成。请参见正则表达式。
窗体上的控件布局只是我第一个想到的布局。它绝对需要在几个方面改进:可调整大小、制表符顺序等。
对于 RegExp 类别的每个属性和方法都有一个控件,因此您可以行使它的所有功能。每个控件都会通过设置适当的属性并同时调用Test 和Execute 方法来响应Changed 和Click 事件。
VERSION 5.00 Begin VB.Form frmRegExpTester Caption = "Form1" ClientHeight = 11700 ClientLeft = 60 ClientTop = 360 ClientWidth = 11010 BeginProperty Font Name = "System" Size = 9.75 Charset = 0 Weight = 700 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty LinkTopic = "Form1" ScaleHeight = 11700 ScaleWidth = 11010 StartUpPosition = 3 'Windows Default Begin VB.TextBox txtTestresult BeginProperty Font Name = "Fixedsys" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 495 Left = 1320 TabIndex = 10 Text = "Text1" Top = 2880 Width = 4095 End Begin VB.TextBox txtExecuteresult BeginProperty Font Name = "Fixedsys" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 9135 Left = 6840 MultiLine = -1 'True TabIndex = 9 Text = "frmRegExpTester.frx":0000 Top = 2520 Width = 4095 End Begin VB.TextBox txtReplace BeginProperty Font Name = "Fixedsys" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 615 Left = 960 MultiLine = -1 'True TabIndex = 5 Text = "frmRegExpTester.frx":0006 Top = 1440 Width = 8295 End Begin VB.CheckBox chkMultiLine Caption = "Multiline" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 495 Left = 3360 TabIndex = 4 Top = 840 Value = 1 'Checked Width = 1575 End Begin VB.CheckBox chkIgnoreCase Caption = "Ignore Case" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 1800 TabIndex = 3 Top = 960 Value = 1 'Checked Width = 1575 End Begin VB.CheckBox chkGlobal Caption = "Global" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Left = 240 TabIndex = 2 Top = 960 Value = 1 'Checked Width = 1455 End Begin VB.TextBox txtPattern BeginProperty Font Name = "Fixedsys" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 615 Left = 840 MultiLine = -1 'True TabIndex = 1 Text = "frmRegExpTester.frx":000C Top = 120 Width = 8535 End Begin VB.TextBox txtSource BeginProperty Font Name = "Fixedsys" Size = 9 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 6735 Left = 0 MultiLine = -1 'True TabIndex = 0 Text = "frmRegExpTester.frx":0022 Top = 4920 Width = 5655 End Begin VB.Label Label3 Caption = "Test status" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 0 TabIndex = 11 Top = 3000 Width = 1215 End Begin VB.Label Label2 Caption = "Execute status" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 255 Left = 5520 TabIndex = 8 Top = 2640 Width = 1215 End Begin VB.Label Label1 Caption = "Replacement" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Index = 1 Left = 0 TabIndex = 7 Top = 1560 Width = 735 End Begin VB.Label Label1 Caption = "Pattern" BeginProperty Font Name = "MS Sans Serif" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 375 Index = 0 Left = 0 TabIndex = 6 Top = 240 Width = 735 End End Attribute VB_Name = "frmRegExpTester" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit
RegExp 实例可用于此模块中的所有代码,尽管这并非严格必要,因为我们可以每次创建一个新的实例。
Private moRe As RegExp
每个Boolean 属性都由一个CheckBox 控件表示。每个控件的点击事件只是设置适当的属性值并通过xExecute 本地子例程调用Execute 方法。
Private Sub chkGlobal_Click() moRe.Global = chkGlobal = vbChecked xExecute End Sub Private Sub chkIgnoreCase_Click() moRe.IgnoreCase = chkIgnoreCase = vbChecked xExecute End Sub Private Sub chkMultiLine_Click() moRe.MultiLine = chkMultiLine = vbChecked xExecute End Sub
当创建窗体时,会调用Initialize 事件处理程序。这将创建 RegExp 实例并将属性设置为与控件的值相对应。
Private Sub Form_Initialize() Set moRe = New RegExp With moRe .Global = chkGlobal = vbChecked .IgnoreCase = chkIgnoreCase = vbChecked .MultiLine = chkMultiLine = vbChecked .Pattern = txtPattern End With End Sub
当用户更改正则表达式 或源文本时,通过调用xExecute 更新输出。
Private Sub txtPattern_Change() xExecute End Sub Private Sub txtSource_Change() xExecute End Sub
这是程序的核心。它所做的就是调用Execute 方法,然后构造一个字符串来表示结果。如果模式 无效,则Execute 方法将引发错误。这会被捕获,并且错误描述将用于代替结果。结果对象被声明为Object,因为返回值可以是Match 或MatchCollection,具体取决于是否存在一个匹配项或多个匹配项。结果显示在txtExecuteResult 和txtTestresult 文本框中。
Private Sub xExecute() moRe.Pattern = txtPattern Dim o As Object On Error Resume Next Set o = moRe.Execute(txtSource) If Err Then txtExecuteresult = Err.Number & ", " & Err.Description Else On Error GoTo 0 If TypeOf o Is Match Then txtExecuteresult = xMatchToString(o) ElseIf TypeOf o Is MatchCollection Then txtExecuteresult = xMatchCollectionToString(o) End If End If On Error GoTo 0 On Error Resume Next txtTestresult = moRe.Test(txtSource) If Err Then txtTestresult = Err.Number & ", " & Err.Description End If On Error GoTo 0 End Sub
该程序的全部目的是向用户展示将正则表达式与文本字符串匹配的结果。为此,我们只需创建一个表示Match 或MatchCollection 对象的字符串即可。
Private Function xMatchCollectionToString(ByRef roMatchCollection As MatchCollection) As String Dim lX As Long With roMatchCollection xMatchCollectionToString = ".Count:" & .Count & vbCrLf For lX = 0 To .Count - 1 xMatchCollectionToString = xMatchCollectionToString _ & "Item " & lX & vbCrLf _ & xMatchToString(.Item(lX)) Next lX End With End Function Private Function xMatchToString(ByRef roMatch As Match) As String With roMatch xMatchToString = ".FirstIndex:" & .FirstIndex & vbCrLf _ & " .Length:" & .Length & vbCrLf _ & " .Value:" & .Value & vbCrLf _ & ".SubMatches:" & vbCrLf _ & xSubMatchesToString(.SubMatches) & vbCrLf End With End Function Private Function xSubMatchesToString(ByRef roSubMatches As SubMatches) As String Dim lX As Long With roSubMatches xSubMatchesToString = ".Count:" & .Count & vbCrLf For lX = 0 To .Count - 1 xSubMatchesToString = xSubMatchesToString _ & "Item " & lX & vbCrLf _ & """" & .Item(lX) & """" Next lX End With End Function
项目文件非常简单。除了正则表达式库之外,没有其他不寻常的引用。
Type=Exe Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\WINNT\System32\stdole2.tlb#OLE Automation Reference=*\G{3F4DACA7-160D-11D2-A8E9-00104B365C9F}#5.5#0#..\..\..\..\..\..\WINNT\System32\vbscript.dll\3#Microsoft VBScript Regular Expressions 5.5 Form=frmRegExpTester.frm Startup="frmRegExpTester" HelpFile="" Title="prjGet" Command32="C:\users\kjw\homepage\website\vb\wikirepository\Jarithmetic_Round_Two_Implementation.html" Name="prjRegExpTester" HelpContextID="0" CompatibleMode="0" MajorVer=1 MinorVer=0 RevisionVer=0 AutoIncrementVer=0 ServerSupportFiles=0 VersionCompanyName="" CompilationType=0 OptimizationType=0 FavorPentiumPro(tm)=0 CodeViewDebugInfo=0 NoAliasing=0 BoundsCheck=0 OverflowCheck=0 FlPointCheck=0 FDIVCheck=0 UnroundedFP=0 StartMode=0 Unattended=0 Retained=0 ThreadPerObject=0 MaxNumberOfThreads=1
练习
- 运行程序,看看你是否能使它崩溃。
- 整理用户界面,添加加速键以帮助导航,修复制表符顺序。
- 想一想可能值得添加的功能,并添加它。
上一个:案例研究 | 目录 | 下一个:JArithmetic |