llztt 发表于 2010-2-20 10:54:43

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

本帖最后由 llztt 于 2010-2-21 20:35 编辑

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

试了一晚上了,没成功。。特来求助,谢谢

顽固不化 发表于 2010-2-20 14:19:32

不知道啥意思,如有重复只留一个?

llztt 发表于 2010-2-20 16:03:27

恩那,呵呵

sanmoking 发表于 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
                Local $b = _ArrayFindAll($x,$a[$i],1,$x,1)
                For $m = 0 To UBound ($b)-1
                        _ArrayDelete($x, $b[$m]-$m)
                Next               
                _ArrayInsert($x,$b, $a[$i])
        Next
        _ArrayDelete($x,0)
        Return _ArrayToString($x,$s)       
EndFunc

sanmoking 发表于 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"了...

afan 发表于 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
For $i = 1 To UBound($sR) - 1
        If StringInStr($new, $sR[$i]) = 0 Then $new &= $sR[$i]
Next
If $sR = '$' Then $new &= $sR
MsgBox(0, $Str, $new)

pusofalse 发表于 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
        If ($aVar[$i] = "") Then ContinueLoop
        If (StringInStr($sVar, "$" & $aVar[$i] & "$")) Then ContinueLoop
        $sVar &= "$" & $aVar[$i] & "$"
        $sResult &= "$" & $aVar[$i]
Next
Msgbox(0, "", $sResult & "$")

sanmoking 发表于 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
                Local $b = _ArrayFindAll($x,$a[$i],1,$x,1)
                For $m = 1 To UBound ($b)-1
                        _ArrayDelete($x, $b[$m]-$m+1)
                Next               
;               _ArrayInsert($x,$b, $a[$i])
      Next
      _ArrayDelete($x,0)
      Return _ArrayToString($x,$s)      
EndFunc

llztt 发表于 2010-2-21 17:41:53

非常感谢楼上几位捧场,尤其sanmoking兄,忒热心啦,呵呵
如AFAN兄所言,我确实想用StringRegExpReplace一句搞定来,但被那个“零宽断言”“后项引用”什么的弄的头大,没搞成,特来求救了,至于StringSplit是后来搞不成就凑合用了

再次感谢各位
页: [1]
查看完整版本: $12$2$3$12$2$5$2$,求删除类似字符串中重复数值的正则 (已解决)