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

[效率算法] $12$2$3$12$2$5$2$,求删除类似字符串中重复数值的正则 (已解决)

  [复制链接]
发表于 2010-2-20 10:54:43 | 显示全部楼层 |阅读模式
本帖最后由 llztt 于 2010-2-21 20:35 编辑

想用StringRegExpReplace来解决问题,如$12$2$3$12$2$5$2$,经过替换后为$12$2$3$5$

试了一晚上了,没成功。。特来求助,谢谢
发表于 2010-2-20 14:19:32 | 显示全部楼层
不知道啥意思,如有重复只留一个?
 楼主| 发表于 2010-2-20 16:03:27 | 显示全部楼层
恩那,呵呵
发表于 2010-2-21 10:53:43 | 显示全部楼层
楼主给加多少分??
#include <Array.au3>
$mmmm = "12&2&3&12&2&5&2&15&19&17&15&&"
MsgBox(0, "ok",chongfu($mmmm, "&"))


Func chongfu($data, $s);$s=分隔符...
Local $a = StringSplit($data, $s, 1)
Local $x = $a 
        For $i = 1 To $a[0]
                Local $b = _ArrayFindAll($x,$a[$i],1,$x[0],1)
                For $m = 0 To UBound ($b)-1 
                        _ArrayDelete($x, $b[$m]-$m)
                Next                
                _ArrayInsert($x,$b[0], $a[$i])
        Next
        _ArrayDelete($x,0)
        Return _ArrayToString($x,$s)        
EndFunc

评分

参与人数 1金钱 +40 贡献 +10 收起 理由
llztt + 40 + 10 谢谢

查看全部评分

发表于 2010-2-21 11:18:50 | 显示全部楼层
楼上的代码适合以下各种情况:
分隔符在前,比如"&abc&d&abc&ff&mm&&"="&abc&d&ff&mm"
分隔符在后,比如"abc&d&abc&ff&mm&&"="abc&d&ff&mm&"
而且支持多字符的分割符.. "&-&-abc&-d&-abc&-&ff&-mm&-"="&-abc&-d&-&ff&-mm"
另外注意的是,两端有空数据的时候(也就是只有分隔符,或者说是两个分隔符之间没有其他字符)会自动自动忽略,比如上面的例子红色部分...
中间有重复分隔符的时候,则会改变分隔符的识别方法,比如"abc&d&abc&&&ff&mm&"
将会理解为"abc&d&abc&"+"&&ff&mm&"两段字符,前一段的分割符在数据后边,后一段的分割符在数据前面,结果就是"abc&d&" +  "&ff&mm"了...
发表于 2010-2-21 11:59:11 | 显示全部楼层
LZ 如想用 StringRegExpReplace 一次搞定应该不行…… 如只需结果那 sanmoking 的就行了~
或者
$Str = '$12$2$3$12$2$5$2$12$2$3$12$2$5$2$12$2$3$12$2$5$2$'
$sR = StringRegExp($Str, '\$[^\$]*', 3)
$new = $sR[0]
For $i = 1 To UBound($sR) - 1
        If StringInStr($new, $sR[$i]) = 0 Then $new &= $sR[$i]
Next
If $sR[UBound($sR) - 1] = '$' Then $new &= $sR[UBound($sR) - 1]
MsgBox(0, $Str, $new)
发表于 2010-2-21 12:30:47 | 显示全部楼层
Local $aVar, $sVar, $sResult, $sString = "$12$2$3$12$2$5$2$12$2$3$12$2$5$2$12$2$3$12$2$5$2$"

$aVar = StringSplit($sString, "$")
For $i = 1 To $aVar[0]
        If ($aVar[$i] = "") Then ContinueLoop
        If (StringInStr($sVar, "$" & $aVar[$i] & "$")) Then ContinueLoop
        $sVar &= "$" & $aVar[$i] & "$"
        $sResult &= "$" & $aVar[$i]
Next
Msgbox(0, "", $sResult & "$")
发表于 2010-2-21 14:01:17 | 显示全部楼层
修改了一下,增加点效率,
红色=删除,橙色=修改.绿色=增加

#include <Array.au3>
$mmmm = "12&2&3&12&2&5&2&15&19&17&15&&"
MsgBox(0, "ok",chongfu($mmmm, "&"))
Func chongfu($data, $s);$s=分隔符...
Local $a = StringSplit($data, $s, 1)
Local $x = $a

        For $i = 1 To $a[0]
                Local $b = _ArrayFindAll($x,$a[$i],1,$x[0],1)
                For $m =
1 To UBound ($b)-1
                        _ArrayDelete($x, $b[$m]-$m
+1)
                Next               
;               _ArrayInsert($x,$b[0], $a[$i])
        Next
        _ArrayDelete($x,0)
        Return _ArrayToString($x,$s)      
EndFunc
 楼主| 发表于 2010-2-21 17:41:53 | 显示全部楼层
非常感谢楼上几位捧场,尤其sanmoking兄,忒热心啦,呵呵
如AFAN兄所言,我确实想用StringRegExpReplace一句搞定来,但被那个“零宽断言”“后项引用”什么的弄的头大,没搞成,特来求救了,至于StringSplit是后来搞不成就凑合用了

再次感谢各位
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-10 04:04 , Processed in 0.089376 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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