C.L
发表于 2010-8-7 14:38:10
回复 30# afan
哦,双字节的是16进制的,含有A-F,这个好办,转成16进制运算
Dim $a = "123456789abcdefg123456789abcdefg双字节"
Dim $b = "双字节abcdefg123456789abcdefg123456789"
$a = StringRegExpReplace(StringTrimLeft(StringToBinary($a),2),"(\S{1})(\S{1})","+0x$1+0x$2")
$b = StringRegExpReplace(StringTrimLeft(StringToBinary($b),2),"(\S{1})(\S{1})","+0x$1+0x$2")
MsgBox (0,"",Execute($a)==Execute($b))
lixiaolong
发表于 2010-8-7 14:39:50
我比较愚钝,硬是没看懂楼主的意思…
afan
发表于 2010-8-7 19:15:28
回复afan
哦,双字节的是16进制的,含有A-F,这个好办,转成16进制运算
C.L 发表于 2010-8-7 14:38 http://www.autoitx.com/images/common/back.gif
ok了~
p.s 表达式如此即可了: "(\S)", "+0x$1"
水木子
发表于 2010-8-7 19:21:34
回复 33# afan
是啊!我也觉得这个表达式 有部分是多余的。
pusofalse
发表于 2010-8-7 21:39:51
某个宽字符的编码是0xABCD,可能会与某个编码是0xCDAB的字符相混淆了~
afan
发表于 2010-8-7 21:56:33
某个宽字符的编码是0xABCD,可能会与某个编码是0xCDAB的字符相混淆了~
pusofalse 发表于 2010-8-7 21:39 http://www.autoitx.com/images/common/back.gif
很有道理~
C.L
发表于 2010-8-7 22:39:16
本帖最后由 C.L 于 2010-8-7 22:52 编辑
回复 35# pusofalse
还是P版厉害,没想到这里的两个字节可以互换,没办法只能单独对双字节进行处理了,代码在下面
回复 33# afan
是的,那个多余了,我原来是用(\S{2})来做的,后来改成1了,懒得改,就成这样了,呵呵~~
修改了下代码,对双字节进行了处理
补充:‘纪’字二进制是:0xBCCD,'图'字二进制是:0xCDBC
#include <array.au3>
Dim $a = "123456789abcdefg双字图123456789abcdefg节"
Dim $b = "双纪abcdefg123456789字abcdefg123456789节"
$aU = StringRegExpReplace($a, '.*?([^\x00-\xff]).*?', '$1')
$bU = StringRegExpReplace($b, '.*?([^\x00-\xff]).*?', '$1')
$a = StringRegExpReplace(StringTrimLeft(StringToBinary($a), 2), "(\S)", "+0x$1")
$b = StringRegExpReplace(StringTrimLeft(StringToBinary($b), 2), "(\S)", "+0x$1")
$c = StringRegExpReplace(StringTrimLeft(StringToBinary($aU), 2), "(\S{4})", "+0x$1")
$d = StringRegExpReplace(StringTrimLeft(StringToBinary($bU), 2), "(\S{4})", "+0x$1")
MsgBox(0, "", Execute($a) == Execute($b) And Execute($c) == Execute($d))
pusofalse
发表于 2010-8-8 00:33:02
也不必单独处理双字节吧,用StringToBinary($a, 2)将单字节改为双字节,原本的双字节字符仍旧是双字节。
正则替换成0x3100+0x3200+0xBCCD+...这样的形式~
C.L
发表于 2010-8-8 01:31:23
本帖最后由 C.L 于 2010-8-8 01:33 编辑
回复 38# pusofalse
有道理,今天我的思路有点混乱,这段时间总想着多学点正则,把事情弄得复杂化了,呵呵~
按你说的改过来
Dim $a = "123456789abcdefg双字123456789图abcdefg节"
Dim $b = "双abcdefg123456789纪字abcdefg123456789节"
$a = StringRegExpReplace(StringTrimLeft(StringToBinary($a,2), 2), "(\S{4})", "+0x$1")
$b = StringRegExpReplace(StringTrimLeft(StringToBinary($b,2), 2), "(\S{4})", "+0x$1")
MsgBox(0, "", Execute($a) == Execute($b))
zhongzijie
发表于 2010-8-11 23:55:39
学习了,谢谢楼主
lin0308
发表于 2010-8-12 14:32:44
回复 40# zhongzijie
应该谢谢回答的人
weiyun
发表于 2010-8-12 17:49:49
本帖最后由 weiyun 于 2010-8-12 18:15 编辑
用加法?
Dim $a = "14"
Dim $b = "23"
返回True
21楼代码没有这个问题但仍然可能有错误
还是排序比较好
weiyun
发表于 2010-8-12 18:16:41
#include <array.au3>
If _StringContrast("123", "321") Then
MsgBox(0, 0, "相似")
Else
MsgBox(0, 0, "不相似")
EndIf
Func _StringContrast($sString1, $sString2, $casesense = 1)
If StringLen($sString1) = StringLen($sString1) Then
$a_array = StringSplit($sString1, "", 3)
$b_array = StringSplit($sString2, "", 3)
_ArraySort($a_array)
_ArraySort($b_array)
$a_String = _ArrayToString($a_array)
$b_String = _ArrayToString($b_array)
Return StringCompare($a_String, $b_String, $casesense) = 0
EndIf
Return False
EndFunc ;==>_StringContrast
大绯狼
发表于 2010-8-13 21:18:03
weiyun 发表于 2010-8-12 18:16 http://www.autoitx.com/images/common/back.gif
都搞这么复杂,23楼代码不会出错,大众想法其实可能就是最优解。