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楼代码不会出错,大众想法其实可能就是最优解。
页: 1 2 [3]
查看完整版本: 判断无序字符是否相等(已解决)