cxm23 发表于 2012-5-8 21:09:16

[已解决]字符替换问题

本帖最后由 cxm23 于 2012-5-8 22:47 编辑

规定A=1,B=2,C=3,D=4,E=5,字符串可能为A或AB或ACD或BDE等组合,想要把字符串替换为相应的1,12,134,245,请问要怎么实现比较高效。
只想到一种方法:因为StringReplace 函数一次只能替换一个字符,所以先得到字符个数,然后循环替换,可是觉得挺没效率的,请问有什么其他方法吗?

whitehead 发表于 2012-5-8 21:27:53

咱们凡人也就能想到用StringReplace 函数了,等高手

lixiaolong 发表于 2012-5-8 21:40:47

回复 1# cxm23

看不太懂...字符串是=前面的吗?
你用StringReplace这么替换的?把代码贴上来吧.

whitehead 发表于 2012-5-8 21:44:34

回复 3# lixiaolong

我理解是要把比如ACD替换为134

cxm23 发表于 2012-5-8 21:46:33

回复lixiaolong

我理解是要把比如ACD替换为134
whitehead 发表于 2012-5-8 21:44 http://www.autoitx.com/images/common/back.gif

是的,可以理解为一个字符串里替换多个子串

afan 发表于 2012-5-8 21:54:04

老老实实循环替换吧

whitehead 发表于 2012-5-8 22:02:39

既然A大说了,那就是没有捷径了

cxm23 发表于 2012-5-8 22:21:59

呵, ~ 想不出了,先这样吧,期待StringReplace函数的增强版

veket_linux 发表于 2012-5-8 22:24:17

循环 很好用

Local $str = "ABCDADCADACAEDDCBABBCE"
Local $newstr = ""
Local $array = StringToASCIIArray($str)
Local $i
For $i = 0 To UBound($array)-1
        If $array[$i]>=Asc("A") And $array[$i]<=Asc("E") Then
                $array[$i] += Asc("1") - Asc('A')
        EndIf
Next
$newstr = StringFromASCIIArray($array)
MsgBox(0, "", $str & @CRLF & $newstr)

zldfsz 发表于 2012-5-8 22:24:47

既然A大都这样说了,那你就认命吧{:face (303):}

lixiaolong 发表于 2012-5-8 22:25:32

还是得用循环.


$str = 'A'
MsgBox(0, $str, str($str))

$str = 'AB'
MsgBox(0, $str, str($str))

$str = 'ACD'
MsgBox(0, $str, str($str))

$str = 'BDE'
MsgBox(0, $str, str($str))

$str = 'BDEAC'
MsgBox(0, $str, str($str))

$str = 'BDEACPFGHIUUYFUGIUGOUHIUGIYGUGFGOU'
MsgBox(0, $str, str($str))

Func str($string)
        Local $Replace, $l
        $l = StringSplit(StringUpper($string), "", 0)

        For $b = 1 To $l
                For $s = 65 To 90
                        If Chr($s) == $l[$b] Then
;~                                 $Replace &= $s - 64
                                $Replace &= $s - 64 & ','
                        EndIf
                Next
        Next
;~         Return $Replace
        Return StringTrimRight($Replace, 1)
EndFunc   ;==>str

cxm23 发表于 2012-5-8 22:44:57

代码真简洁,看了好久才明白,本来是想用switchcase 一个一个替换的,学习了{:face (239):}

zldfsz 发表于 2012-5-8 23:02:27

回复 1# cxm23
Local $str = "ABCDADCADACAEDDCBABBCE"
$str = StringRegExpReplace($str, "A", '1')
$str = StringRegExpReplace($str, "B", '2')
$str = StringRegExpReplace($str, "C", '3')
$str = StringRegExpReplace($str, "D", '4')
$str = StringRegExpReplace($str, "E", '5')
MsgBox(4096, "测试", $str)

netegg 发表于 2012-5-8 23:12:30

本帖最后由 netegg 于 2012-5-8 23:17 编辑

Local $str = "ABCDADCADACAEDDCBABBCE", $ret = ''
while stringlen($str)
$ret &= asc(stringleft($str, 1)) -64
$str = stringtrimleft($str, 1)
wend
MsgBox(0,0,$ret)

afan 发表于 2012-5-8 23:15:18

本帖最后由 afan 于 2012-5-8 23:21 编辑

LZ这种规则的 A=1 B=2 C=3 ... 实际应用并不多吧,用2维数组可能更有实用意义,可以为任意的字符Local $a2 = [['A', 1],['B', 2],['C', 3],['D', 4],['E', 5]]
Local $str = 'BDEACE', $sTest = $str
For $i = 0 To UBound($a2) - 1
        $sTest = StringReplace($sTest, $a2[$i], $a2[$i])
Next
MsgBox(0, $str, $sTest)Local $a2 = [['A', 1],['b', '二'],['C', 33],['D', 'Si'],['E0', @CRLF]]
Local $str = 'BDE0ACE', $sTest = $str
For $i = 0 To UBound($a2) - 1
        $sTest = StringReplace($sTest, $a2[$i], $a2[$i])
Next
MsgBox(0, $str, $sTest)
页: [1] 2
查看完整版本: [已解决]字符替换问题