找回密码
 加入
搜索
楼主: lin0308

[AU3基础] 判断无序字符是否相等(已解决)

 火... [复制链接]
发表于 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))
发表于 2010-8-7 14:39:50 | 显示全部楼层
我比较愚钝,硬是没看懂楼主的意思…
发表于 2010-8-7 19:15:28 | 显示全部楼层
回复  afan

哦,双字节的是16进制的,含有A-F,这个好办,转成16进制运算
C.L 发表于 2010-8-7 14:38


ok了~
p.s 表达式如此即可了: "(\S)", "+0x$1"
发表于 2010-8-7 19:21:34 | 显示全部楼层
回复 33# afan

是啊!我也觉得这个表达式 有部分是多余的。
发表于 2010-8-7 21:39:51 | 显示全部楼层
某个宽字符的编码是0xABCD,可能会与某个编码是0xCDAB的字符相混淆了~
发表于 2010-8-7 21:56:33 | 显示全部楼层
某个宽字符的编码是0xABCD,可能会与某个编码是0xCDAB的字符相混淆了~
pusofalse 发表于 2010-8-7 21:39



    很有道理~
发表于 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))
发表于 2010-8-8 00:33:02 | 显示全部楼层
也不必单独处理双字节吧,用StringToBinary($a, 2)将单字节改为双字节,原本的双字节字符仍旧是双字节。
正则替换成0x3100+0x3200+0xBCCD+...这样的形式~

评分

参与人数 1金钱 +30 收起 理由
C.L + 30 多谢提醒

查看全部评分

发表于 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))

评分

参与人数 2金钱 +40 收起 理由
afan + 20
pusofalse + 20

查看全部评分

发表于 2010-8-11 23:55:39 | 显示全部楼层
学习了,谢谢楼主
 楼主| 发表于 2010-8-12 14:32:44 | 显示全部楼层
回复 40# zhongzijie


    应该谢谢回答的人

评分

参与人数 1金钱 +10 收起 理由
afan + 10 我很赞同

查看全部评分

发表于 2010-8-12 17:49:49 | 显示全部楼层
本帖最后由 weiyun 于 2010-8-12 18:15 编辑

用加法?
Dim $a = "14"
Dim $b = "23"
返回True
21楼代码没有这个问题但仍然可能有错误
还是排序比较好
发表于 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

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2010-8-13 21:18:03 | 显示全部楼层
weiyun 发表于 2010-8-12 18:16



都搞这么复杂,23楼代码不会出错,大众想法其实可能就是最优解。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-17 00:28 , Processed in 0.073205 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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