找回密码
 加入
搜索
查看: 4288|回复: 8

[效率算法] 又是正则问题

  [复制链接]
发表于 2011-9-30 20:25:02 | 显示全部楼层 |阅读模式
问题~~~有一些目标数据,本身没有什么规律,但某个指定的字符前面是符合某一特定规则的字符串,通过正则把不符合的字符找出来。比如一个数据样本
1122d3455d8d56dcf44drt66ddtr54
我想保证d的前面是两个相同的数字,用其他的符号替换掉不符合规则的d。请问如何做到呢?
发表于 2011-9-30 21:48:24 | 显示全部楼层
$str="1122d3455d8d56dcf44drt66ddtr54"
$arr=StringSplit($str,"d")
$result=""
For $i=1 To $arr[0]-1
        If StringLen($arr[$i])<2 Then
                $result&=$arr[$i]&"*"
        Else
                If StringRegExp($arr[$i],"(\d)\1$",0) Then
                        $result&=$arr[$i]&"d"
                Else
                        $result&=$arr[$i]&"*"
                EndIf
        EndIf
next
$result&=$arr[$arr[0]]
MsgBox(0,"",$result)
我只能这样实现,正则的可以找出符合的,不符合的实在没想出来怎么找

评分

参与人数 1金钱 +10 收起 理由
gzh888666 + 10

查看全部评分

 楼主| 发表于 2011-9-30 22:34:58 | 显示全部楼层
回复 2# kevinch


    看来一次性是搞不定了。我开始想的办法是先找出符合的,替换成其他字符‘保护起来’,再替换剩下的。变通的方法还是蛮多的~~
发表于 2011-9-30 23:38:57 | 显示全部楼层
本帖最后由 3mile 于 2011-9-30 23:56 编辑

Local $Str = '1122d3455d8d56dcf44drt66ddtr54' 
Local $Test = StringRegExpReplace($str, '(\d)((?(?!\1).))(d)|(?<=d)(\d)d', '\1\2\4*')
MsgBox(0, '替换结果', $Test)

评分

参与人数 1金钱 +10 收起 理由
gzh888666 + 10

查看全部评分

发表于 2011-10-1 00:05:42 | 显示全部楼层
一句正则替换的确不是新手能弄的,弄了半天也没弄成,等a版来吧!
发表于 2011-10-1 00:48:58 | 显示全部楼层
回复 4# 3mile


Local $Str = '1122d3455d8d56dcf44drt66ddtr54' 
;~ Local $Test = StringRegExpReplace($str, '(\d)((?(?!\1).))(d)|(?<=d)(\d)d', '\1\2\4*')
Local $Test = StringRegExpReplace($str, '(\S)(?!\1)(.)d', '$1$2\*')
MsgBox(0, '替换结果', $Test)

评分

参与人数 1金钱 +10 收起 理由
gzh888666 + 10

查看全部评分

发表于 2011-10-1 01:10:06 | 显示全部楼层
回复 4# 3mile


    我看了下你的表达式,恩……有点儿针对性,把测试字符串改成:
1122d3455di8d56dcf44drt66ddtr54
就有问题,表达式有点儿针对性哦
表达式中用了类if判断,挺深奥,哈哈
发表于 2011-10-1 03:05:47 | 显示全部楼层
本帖最后由 gzh888666 于 2011-10-1 03:18 编辑
回复  3mile
binghc 发表于 2011-10-1 00:48


1122d3455di8d56dcf44drt66ddtr54ddd
(\S)(?!\1)(.)d 替换$1$2\* 我测试的有错误,问一下这个(?!\1)的作用!不明白这句其中的?!和\1
发表于 2011-10-1 09:34:45 | 显示全部楼层
回复 7# binghc
嗯,用\S比较有通用性。
试试:(\S)((?(?!\1).))(d)

评分

参与人数 1金钱 +30 收起 理由
kevinch + 30 学习了

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-1 06:58 , Processed in 0.082997 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表