蜘蛛抱蛋 发表于 2011-9-30 20:25:02

又是正则问题

问题~~~有一些目标数据,本身没有什么规律,但某个指定的字符前面是符合某一特定规则的字符串,通过正则把不符合的字符找出来。比如一个数据样本1122d3455d8d56dcf44drt66ddtr54我想保证d的前面是两个相同的数字,用其他的符号替换掉不符合规则的d。请问如何做到呢?

kevinch 发表于 2011-9-30 21:48:24

$str="1122d3455d8d56dcf44drt66ddtr54"
$arr=StringSplit($str,"d")
$result=""
For $i=1 To $arr-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]
MsgBox(0,"",$result)我只能这样实现,正则的可以找出符合的,不符合的实在没想出来怎么找

蜘蛛抱蛋 发表于 2011-9-30 22:34:58

回复 2# kevinch


    看来一次性是搞不定了。我开始想的办法是先找出符合的,替换成其他字符‘保护起来’,再替换剩下的。变通的方法还是蛮多的~~

3mile 发表于 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)

gzh888666 发表于 2011-10-1 00:05:42

一句正则替换的确不是新手能弄的,弄了半天也没弄成,等a版来吧!

binghc 发表于 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)

binghc 发表于 2011-10-1 01:10:06

回复 4# 3mile


    我看了下你的表达式,恩……有点儿针对性,把测试字符串改成:
1122d3455di8d56dcf44drt66ddtr54
就有问题,表达式有点儿针对性哦
表达式中用了类if判断,挺深奥,哈哈

gzh888666 发表于 2011-10-1 03:05:47

本帖最后由 gzh888666 于 2011-10-1 03:18 编辑

回复3mile
binghc 发表于 2011-10-1 00:48 http://www.autoitx.com/images/common/back.gif

1122d3455di8d56dcf44drt66ddtr54ddd
(\S)(?!\1)(.)d 替换$1$2\* 我测试的有错误,问一下这个(?!\1)的作用!不明白这句其中的?!和\1

3mile 发表于 2011-10-1 09:34:45

回复 7# binghc
嗯,用\S比较有通用性。
试试:(\S)((?(?!\1).))(d)
页: [1]
查看完整版本: 又是正则问题