« VB 判断图片文件的类型格式VB RichText控件中解析HTML代码 »

增强版VB正则表达式(VBScript.RegExp)组件,兼容Perl正则语法

NewXing.RegExp 正则组件.rar (更新2015-1-11)

本组件用的是DEELX 正则引擎封装的com组件。
特点:
    1、完全兼容VBScript.RegExp 正则组件的各种属性与方法
    2、支持与 Perl 兼容的正则表达式语法。 
    3、支持 Ignorecase, Singleline, Multiline… 等常见匹配模式。 
    4、支持命名分组,条件表达式,递归表达式,零宽断言…等多种高级特性。
    详细语法与编程帮助请下载《NewXing.RegExp帮助文档》。
    一、NewXing.RegExp 对象
属性 描述
Global 是否全局匹配,默认值False,即只会匹配一次,如要匹配所有需将它的值设置为True
IgnoreCase 匹配时是否忽略大小写,默认是区分大小的。值:(True/False)
Pattern 用于设置正则表达式。值:字符串

Multiline

多行模式。

使 ^ 符号除了能够匹配字符串开始位置外,还能匹配换行符(\n)之后的位置;使 $ 符号除了能够匹配字符串结束位置外,还能匹配换行符之前的位置。

默认情况下, ^ 符号只能匹配字符串开始位置, $ 符号只能匹配字符串结束位置。

SINGLELINE 和 MULTILINE 虽然听起来相互矛盾,但却是作用在不同的地方。因此它们是可以组合使用的。

在指定了 MULTILINE 之后,如果需要仅匹配字符串开始和结束位置,可以使用 \A 和 \Z。

Singleline *

单行模式。

使小数点 "." 可以匹配包含换行符(\n)在内的任意字符。默认情况下,小数点只匹配换行符以外的任意字符,不匹配换行符。

RightToLeft * 从右向左的进行匹配。从被匹配字符串的结束位置向前进行查找匹配,同时,在表达式中也是右侧的表达式先进行匹配。
Extended *

忽略表达式中的空白字符,并且把从 # 开始到该行行末的内容视为注释。默认情况下,正则表达式中的空格,换行等字符将可以匹配相应的字符。

指定了 EXTENDED 模式后,如果要在正则表达式中表示空白字符比如空格符号(space)时,应该用 \x20 表示,如果要在表达式中表示 # 符号,应该用 \# 表示。

不管是否指定了 EXTENDED 模式,括号内以 ?# 号开始时,比如(?# xxx ),那么这一对括号以及包含的内容都始终作为注释而被忽略。

提示:IgnoreCase、Singleline、Global、Multiline、RightToLeft、Extended 这几个属性可用flags参数来设置(后面会讲到),也可以说这几个属性是多余的,只是为了兼容VBScript.RegExp 正则的语法而增加了。

方法 描述
Execute 该方法用来查找字符串,找到的字符串将通过MatchCollection集合返回。
Replace 这个方法用于替换在正则表达式搜索中找到的文本。
Test Test方法对字符串执行正则表达式搜索,并返回一个布尔值说明匹配是否成功。

Split *

按照指定的表达式字符串对目标字符串进行分割并返回一维数组。

PS: * 星号表示新增的属性/方法。即VBScript.RegExp 没有的功能。

二、NewXing.MatchCollection 对象

MatchCollection 是集合对象,包含有关匹配字符串的信息,该对象包含每个成功匹配的 Match 对象。

属性 描述
Count 匹配对象的总数。
Item 匹配对象的索引。

三、NewXing.Match 对象

Match 是成功匹配的对象。

属性 描述
FirstIndex 匹配对象所匹配字符串的起始位置。
Length 匹配对象所匹配字符串的字符长度。
SubMatches 匹配对象所匹配结果的子项,返回SubMatches集合。通过该集合可以获取匹配到的各个命名分组结果。
Value 匹配对象所匹配的值。
Named * 通过命名分组的名字来获取匹配到的结果。

四、NewXing.SubMatches 对象

SubMatches 得到当次匹配到的所有“分组”结果集合。

属性 描述
Count 分组总数
Item 匹配到的结果索引。

五、最后说一下NewXing.RegExp 对象的4个方法的相关参数与作用。
语法:

1、Execute

Execute (sourceString As String, [pattern As String], [flags As String], [start As Long] = -1) As MatchCollection

2、Replace

Replace (sourceString As String, replaceVar As String, [pattern As String], [flags As String], [start As Long] = -1, times As Long = -1) As String

3、Test

Test (sourceString As String, [pattern As String], [flags As String], [start As Long] = -1) As Boolean

4、Split

Split (sourceString As String, [pattern As String], [flags As String], [start As Long] = -1, [times As Long] = -1) As Object

参数说明:

参数 描述
sourceString 必填参数,用来匹配的文本。
replaceVar 必填参数,是用来替代的字符串。Replace 方法中才用到该参数。
pattern * 可选参数,设置正则表达式。如果RegExp.pattern 属性中已设置那么这个参数可忽略,如果两者同时设置,将会选用本参数的表达式进行匹配。
flags *

可选参数,表达式匹配模式。值为:i、s、g、m、r、x

以上字母分别代表:IgnoreCase、Singleline、Global、Multiline、RightToLeft、Extended

i、s、g、m、r、x 可随意组合。

例如:

RegExp.IgnoreCase = True
RegExp.Global = True

可直接用该参数 ig 来代替。当您设置了该参数的值后 IgnoreCase、Singleline、Global、Multiline、RightToLeft、Extended这

6个属性的设置就不起作用了。

start *

可选参数,开始查找匹配的位置。
times *

可选参数,replace方法中用于指定进行替换的次数。默认(-1)表示替换所有匹配。 split 方法中用于指定可拆分为多少个数组,默认拆分所有。

示例:

VBScript code复制代码
Private Sub Form_Load()
    Dim Regex As Object
    Set Regex = CreateObject("NewXing.RegExp")
    Regex.IgnoreCase = True
    Regex.Global = True
    Regex.Pattern = "(\d+)"
    MsgBox Regex.Replace("aa 11 bb 22 33", "[$1]")
    '输出结果:aa [11] bb [22] [33]
End Sub

以上的代码也可以简化为以下这样。

VBScript code复制代码
Private Sub Form_Load()
    Dim Regex As Object
    Set Regex = CreateObject("NewXing.RegExp")
    MsgBox Regex.Replace("aa 11 bb 22 33", "[$1]", "(\d+)", "ig")
End Sub
  • quote 1.您好
  • 您好,不能下载了吗?可不可以发一份给我,谢谢了啊!599246460@qq.com
  • 2013-8-15 19:30:21 回复该留言
  • quote 2.VB
  • 博主,你好!
    感谢你开发了此组件,正在使用,效果很好。
    还希望你能做些改进:
    1、NewXing.RegExp.split(Str, "" )
    此句得到的结果出乎意料。既不是vb中原来的样子,也不是 js 的样子。
    希望能改成像 js 那样。
    js中,split("")得到按每个字符分割的数组:
    "12345abc".split("")
    结果是:[1,2,3,4,5,a,b,c]

    2、多写几个例子吧,有些规则不会用啊,希望能有例子作参考。
    特别是 replace()中 替换语法,。

    再次感谢博主!
  • 2014-11-24 16:31:07 回复该留言
  • quote 3.linhaibo
  • replace 的参数上面已经对每个参数的作用说明的非常详细了哦,其它方面和微软的VBScript.RegExp使用一样,只要你会用微软的,就按照微软的语法那样用就可以了。

    replace() 第二个参数replaceVar ,里面可以调用 $1 $2 $3 ……$999来获取捕获到的分组内容,替换参数还有一些其它语法,比如:
    $number
    ${name}
    $$
    $&
    $`
    $'
    $+
    $_

    详细作用请下载帮助文档,查看Replace 替换操作语法说明。

    split() 第二个参数pattern正则表达式如果为空的话,匹配结果是有点差异。
    VB 于 2014-11-25 22:38:28 回复
    博主,多写几个例子啊。
    新增的语法,不会用啊。
    想看例子来学啊~
    谢谢博主!
  • 2014-11-25 22:09:00 回复该留言
  • quote 4.VB
  • split("") 希望能改成像 js 那样。
    按每个字分割。
  • 2014-11-25 22:15:27 回复该留言
  • quote 5.VB
  • 如果设置了:
    RegExp.IgnoreCase = True
    RegExp.Global = True

    然后又用 flags="s" 设置,
    这时,flags 会不会屏蔽 I 和 G 模式?
    VB 于 2014-11-25 22:30:41 回复
    经测试,
    flags 会 屏蔽 I 和 G 模式
  • 2014-11-25 22:25:59 回复该留言
  • quote 6.VB
  • 博主,你好!
    此组件用了一段时间,发现不太稳定啊。
    我在 Excel2003 的VBA中用此组件,当用递归表达式的时候,很容易导致Excel奔溃。
    无论是 前期绑定 还是 后期绑定,都会奔溃。
    希望您能改进一下啊~~
  • 2014-12-10 18:26:38 回复该留言
  • quote 8.linhaibo
  • 能不能发代码上来看看呀,你怎么写的导致崩溃呀。
    VB 于 2015-9-5 17:45:43 回复
    一直在用 1.0版,最近崩了几次,上来看到博主已经在 2105-01-11 更新到 1.4 了。
    以前没注意到啊~~
    谢谢博主,下载试用~~
  • 2014-12-13 0:19:46 回复该留言
  • quote 9.VB
  • Sub test2()
    Dim reg, i&, s$, m
    s = "aa cat 1234 ,hjy 889z"
    Set reg = CreateObject("newxing.regexp")

    reg.Pattern = "(?=cat )"
    Set m = reg.Execute(s)
    Debug.Print reg.Pattern, m(0).Value, m(0).FirstIndex, m(0).Length

    reg.Pattern = "(?<=cat )"
    Set m = reg.Execute(s)
    Debug.Print reg.Pattern, m(0).Value, m(0).FirstIndex, m(0).Length

    Debug.Print String(50, "-")
    Debug.Print
    End Sub
  • 2015-9-5 18:03:59 回复该留言
  • quote 10.VB
  • m(0).Value 的 .Value 不能做为默认值省略不写,
    而 vb regexp5.5 是可以省略的。
  • 2015-9-5 18:06:37 回复该留言
  • quote 11.VB
  • 还是有崩溃的现象~
    Hehe
    就是用 9楼的代码,
    在调试模式 ,打开 本地窗口,察看 m 的 item1 的 value,居然是乱码。
    而正常的值 应该是 "" 。

    然后,就崩掉了~
    excel2003 vba
  • 2015-9-5 18:11:46 回复该留言
  • quote 12.VB
  • 估计是指针没处理好,野指针乱飞,导致随机出现崩溃现象~
    Sad
  • 2015-9-5 18:48:59 回复该留言
  • quote 13.VB
  • NewXing.RegExp.split("12345678abc", "" )
    发现此法可以分割每个字符到数组了,谢谢博主的努力改进!!
    Haha
  • 2015-9-5 19:10:10 回复该留言
  • quote 16.VB
  • Sleep
    博主还打算修复Bug吗?
    linhaibo 于 2015-9-23 15:49:22 回复
    当然修,不过最近很忙呐Cry
  • 2015-9-14 11:23:41 回复该留言
  • quote 17.VB
  • Smile要不,你把源码公开,看看哪里出问题了~~
  • 2015-9-23 16:42:23 回复该留言
  • quote 18.andyjin
  • 请教了~~~~
    为什么总是显示 没有权限: 'CreateObject'

  • 2017-3-14 15:50:35 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright © 2009-2011 linhaibo.com. All Rights Reserved .