VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 658|回复: 8

[求助] 请教:去除重复中文的正则表达式怎么写?

[复制链接]
发表于 2017-4-1 11:38:59 | 显示全部楼层 |阅读模式
以下是java网页的写法,测试有效:

<script type="text/javascript">
var str="我我我要学学学学VB";
var reg=/([\u4e00-\u9fa5\w])\1+/g; //找到重复中文字符的地方

alert(str.replace(reg,"$1")); 将查找到的地方替换长分组1中的内容
</script>


但如果要转成VB应该怎么写呢?以下代码测试无用,请前辈赐教!

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "/([\u4e00-\u9fa5\w])\1+/g"
    re.Global = False
    re.IgnoreCase = True
    re.MultiLine = True
    MsgBox re.Replace("我我我要学学学学VB", "")
发表于 2017-4-13 22:48:00 | 显示全部楼层
本帖最后由 忧伤 于 2017-4-13 22:50 编辑

/([\u4e00-\u9fa5\w])\1+/g;     这是内嵌的表达式。  后面 /g 表示全局。
可以这样子。
  1. Sub 正则()
  2.            
  3.     Dim myReg As Object               ' 声 明 对 象 变 量
  4.     Dim MyStr As String                     ' 声 明 字 符 变 量 , 表 示 指 定 待 替 换 的 字 符 串 对 象
  5.     Dim Resultstr As String                ' 声 明 字 符 变 量 , 用 于 获 取 返 回 值
  6.     Dim matches, matche
  7.     Set myReg = CreateObject("VBSCRIPT.REGEXP")          '  对变量创 建 对象引 用
  8.     MyStr = "我我我我我要要要要要"                                                          '指定源文本
  9.     With myReg                '引用对象变量
  10.         .Pattern = "([\u4e00-\u9fa5\w])\1+"              '指 定 匹 配 模 式
  11.         .Global = True                                '可选,指 定 全 局 匹 配 对 象 , (默 认 为 false ,只匹配第一个 )
  12.         .IgnoreCaSe = True                  '可选,指 定 匹 配 时 是 否 忽 略 大 小 写 ( 默 认 为 false ,不忽略大小写)
  13.          
  14.          If .Test(MyStr) Then                      '如果匹配成功就
  15.                 Resultstr = .Replace(MyStr, "$1")                   '则将匹配到的文本进行替换,相当于去重。
  16.         Else
  17.                   MsgBox "匹配失败!"
  18.          End If
  19.         

  20.     End With
  21.     MsgBox Resultstr                        ‘显示去重后的文本。
  22.     Set myReg = Nothing    '释放对象


  23. End Sub
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-21 23:31:08 | 显示全部楼层
感谢赐教! 再请教地址分析的问题,欲从一个相对比较标准的地址中分离出【 省(或直辖市或自治州)、地级市、县级市、详细地址】共四级信息,写了一个正则好像也不起作用,不知道哪里出问题了,程序如下:

Private Sub Form_Load()
    exp "浙江省衢州市柯城区三衢路1号"
    exp "北京市崇文区三衢路1号"
    exp "湖北省柯城区三衢路1号"
    End
End Sub

Sub exp(dz)
    Set re = CreateObject("VBScript.RegExp")
    re.Global = False
    re.IgnoreCase = True
    re.Pattern = "(.*?)[省|北京市|天津市|上海市|重庆市|自治区](.*?)[(市)|(县)|(区)](.*?)[区|县|乡|镇|路|街|道|弄|厂|场|号|公司|中心|院|苑|园|幢|栋|楼](.*?)"
    If re.Test(dz) Then
        Set matches = re.Execute(dz)
        d1 = matches(0).SubMatches(0) '匹配到的省或直辖市或自治州
        d2 = matches(0).SubMatches(1) '匹配到的地级市
        d3 = matches(0).SubMatches(2) '匹配到的县级市
        d4 = re.Replace(dz, "")              '剩余的地址信息
        Debug.Print dz, d1, d2, d3, d4
    End If
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-21 23:32:37 | 显示全部楼层
感谢赐教! 再请教地址分析的问题,欲从一个相对比较标准的地址中分离出【 省(或直辖市或自治州)、地级市、县级市、详细地址】共四级信息,写了一个正则好像也不起作用,不知道哪里出问题了,程序如下:

Private Sub Form_Load()
    exp "浙江省衢州市柯城区三衢路1号"
    exp "北京市崇文区三衢路1号"
    exp "湖北省柯城区三衢路1号"
    End
End Sub

Sub exp(dz)
    Set re = CreateObject("VBScript.RegExp")
    re.Global = False
    re.IgnoreCase = True
    re.Pattern = "(.*?)[省|北京市|天津市|上海市|重庆市|自治区](.*?)[(市)|(县)|(区)](.*?)[区|县|乡|镇|路|街|道|弄|厂|场|号|公司|中心|院|苑|园|幢|栋|楼](.*?)"
    If re.Test(dz) Then
        Set matches = re.Execute(dz)
        d1 = matches(0).SubMatches(0) '匹配到的省或直辖市或自治州
        d2 = matches(0).SubMatches(1) '匹配到的地级市
        d3 = matches(0).SubMatches(2) '匹配到的县级市
        d4 = re.Replace(dz, "")              '剩余的地址信息
        Debug.Print dz, d1, d2, d3, d4
    End If
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-21 23:32:50 | 显示全部楼层
感谢赐教! 再请教地址分析的问题,欲从一个相对比较标准的地址中分离出【 省(或直辖市或自治州)、地级市、县级市、详细地址】共四级信息,写了一个正则好像也不起作用,不知道哪里出问题了,程序如下:

Private Sub Form_Load()
    exp "浙江省衢州市柯城区三衢路1号"
    exp "北京市崇文区三衢路1号"
    exp "湖北省柯城区三衢路1号"
    End
End Sub

Sub exp(dz)
    Set re = CreateObject("VBScript.RegExp")
    re.Global = False
    re.IgnoreCase = True
    re.Pattern = "(.*?)[省|北京市|天津市|上海市|重庆市|自治区](.*?)[(市)|(县)|(区)](.*?)[区|县|乡|镇|路|街|道|弄|厂|场|号|公司|中心|院|苑|园|幢|栋|楼](.*?)"
    If re.Test(dz) Then
        Set matches = re.Execute(dz)
        d1 = matches(0).SubMatches(0) '匹配到的省或直辖市或自治州
        d2 = matches(0).SubMatches(1) '匹配到的地级市
        d3 = matches(0).SubMatches(2) '匹配到的县级市
        d4 = re.Replace(dz, "")              '剩余的地址信息
        Debug.Print dz, d1, d2, d3, d4
    End If
End Sub
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-21 23:33:53 | 显示全部楼层
感谢赐教! 再请教地址分析的问题,欲从一个相对比较标准的地址中分离出【 省(或直辖市或自治州)、地级市、县级市、详细地址】共四级信息,写了一个正则好像也不起作用,不知道哪里出问题了,程序如下:

  1. Private Sub Form_Load()
  2.     exp "浙江省衢州市柯城区三衢路1号"
  3.     exp "北京市崇文区三衢路1号"
  4.     exp "湖北省柯城区三衢路1号"
  5.     End
  6. End Sub

  7. Sub exp(dz)
  8.     Set re = CreateObject("VBScript.RegExp")
  9.     re.Global = False
  10.     re.IgnoreCase = True
  11.     re.Pattern = "(.*?)[省|北京市|天津市|上海市|重庆市|自治区](.*?)[(市)|(县)|(区)](.*?)[区|县|乡|镇|路|街|道|弄|厂|场|号|公司|中心|院|苑|园|幢|栋|楼](.*?)"
  12.     If re.Test(dz) Then
  13.         Set matches = re.Execute(dz)
  14.         d1 = matches(0).SubMatches(0) '匹配到的省或直辖市或自治州
  15.         d2 = matches(0).SubMatches(1) '匹配到的地级市
  16.         d3 = matches(0).SubMatches(2) '匹配到的县级市
  17.         d4 = re.Replace(dz, "")              '剩余的地址信息
  18.         Debug.Print dz, d1, d2, d3, d4
  19.     End If
  20. End Sub
复制代码
回复 支持 反对

使用道具 举报

发表于 2017-4-27 00:11:12 | 显示全部楼层
表达式有错误。 []里 正则表达式 选的是单字符。 比如 [北京|江西]   那么匹配时  测试的 是  “北”、“京”、“江”、“西" 这四个字,只要有一个就算成功。
可以换成下面的表达式。  把[]全换成(),并使用 ?: 进行非捕获的匹配。

re.Pattern = "(.*?(?:省|自治区)|北京市|天津市|上海市|重庆市)(.*?)(?:市|县|区)(.*?)(?:区|县|乡|镇|路|街|道|弄|厂|场|号|公司|中心|院|苑|园|幢|栋|楼)"

但结果貌似还有点小问题。看你原来的表达式,貌似是  北京市 和 省 算一级。而且 第二、第三个地址信息有 省略  省和市 的信息。所以 最后的结果是这样子。


浙江省衢州市柯城区三衢路1号    浙江省        衢州          柯城          三衢路1号
北京市崇文区三衢路1号             北京市         崇文          三衢          1号
湖北省柯城区三衢路1号             湖北省         柯城          三衢          1号


本来是路的信息被分成两段。 所以你再研究下?要么完善输入信息,要么把表达式修改?比如把 北京市 挪动到第二级。
回复 支持 反对

使用道具 举报

发表于 2017-4-27 00:12:17 | 显示全部楼层
表达式有错误。 []里 正则表达式 选的是单字符。 比如 [北京|江西]   那么匹配时  测试的 是  “北”、“京”、“江”、“西" 这四个字,只要有一个就算成功。
可以换成下面的表达式。  把[]全换成(),并使用 ?: 进行非捕获的匹配。

re.Pattern = "(.*?(?:省|自治区)|北京市|天津市|上海市|重庆市)(.*?)(?:市|县|区)(.*?)(?:区|县|乡|镇|路|街|道|弄|厂|场|号|公司|中心|院|苑|园|幢|栋|楼)"

但结果貌似还有点小问题。看你原来的表达式,貌似是  北京市 和 省 算一级。而且 第二、第三个地址信息有 省略  省和市 的信息。所以 最后的结果是这样子。


浙江省衢州市柯城区三衢路1号    浙江省        衢州          柯城          三衢路1号
北京市崇文区三衢路1号             北京市         崇文          三衢          1号
湖北省柯城区三衢路1号             湖北省         柯城          三衢          1号


本来是路的信息被分成两段。 所以你再研究下?要么完善输入信息,要么把表达式修改?比如把 北京市 挪动到第二级。
回复 支持 反对

使用道具 举报

发表于 2017-4-27 00:23:22 | 显示全部楼层
看原来的表达式有点混乱,因为不知道要不要捕获,所以我是猜想是 不捕获的,所以如果需要捕获  区,镇,路 这些单位的话, 把上面的?:去掉就好了。 但同时表达式也需要再调整。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2017-10-23 17:36

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表