找回密码
 加入
搜索
查看: 8368|回复: 20

[效率算法] 已解决 用正则怎样删除以Global开头的重复行

 火.. [复制链接]
发表于 2012-7-12 04:33:11 | 显示全部楼层 |阅读模式
本帖最后由 Qokelate 于 2012-7-12 15:43 编辑

对于以Global开头的重复的行,只保留第一次出现那行,其它重复的行删除,用正则怎样写?

目的达成  见5L
 楼主| 发表于 2012-7-12 04:36:05 | 显示全部楼层
本帖最后由 Qokelate 于 2012-7-12 15:18 编辑

示例样本
Global Const $ALLOC_LOG_CONF = 0x00000002
Global Const $BASIC_LOG_CONF = 0x00000000
Global Const $BOOT_LOG_CONF = 0x00000003
Global Const $CM_ADD_ID_BITS = 0x00000001
Global Const $CM_ADD_ID_COMPATIBLE = 0x00000001
Global Const $CM_ADD_ID_HARDWARE = 0x00000000
Global Const $CM_BIND_CLASS_BIND_DEVINST = 0x6
Global Const $CM_BIND_CLASS_BIND_DEVINST = 6
Global Const $CM_BIND_DEVINST_BIND_CLASS = 8
Global Const $CM_BIND_DEVINST_BIND_ID = 1
Global Const $CM_ADD_ID_COMPATIBLE = 0x00000001
Global Const $CM_BIND_CLASS_BIND_DEVINST = 0x6
Global Const $CM_BIND_DEVINST_BIND_PHYSNAME = 2
Global Const $CM_ADD_ID_COMPATIBLE = 1
Global Const $CM_ADD_ID_COMPATIBLE = 0x1
Global Const $CM_BIND_ENUMERATOR_BIND_DEVINST = 32
Global Const $CM_ADD_ID_COMPATIBLE = 0x00000001
Global Const $CM_ADD_ID_COMPATIBLE = 0x1
Global Const $CM_BIND_PHYSNAME_BIND_DEVINST = 4
发表于 2012-7-12 08:03:24 | 显示全部楼层
(?im)^Global.+
 楼主| 发表于 2012-7-12 08:34:53 | 显示全部楼层
回复 3# haijie1223


    没看清楚题目?还是我没表达清楚?
发表于 2012-7-12 08:53:32 | 显示全部楼层
回复 1# Qokelate
$sTexs = 'Global $_MD5_InitOffset, $_MD5_InputOffset, $_MD5_ResultOffset' & @CRLF & _
                'Global $_MDKernel32Dll = DllOpen("kernel32.dll")' & @CRLF & _
                'Global $ghADVAPI32 = DllOpen("advapi32.dll")' & @CRLF & _
                'Global $hWndActive, $iConsolePID, $bKeepRun = 1, $bKeyHook = 0, $hMEM = 0, $iPower = 0' & @CRLF & _
                'Global $sWhiteKey, $sGrayKey, $sInputKey, $sTempCardKey, $sHelpKey, $sQuitKey' & @CRLF & _
                'Global $sWhiteKey, $sGrayKey, $sInputKey, $sTempCardKey, $sHelpKey, $sQuitKey' & @CRLF & _
                'Global $sWhiteKey, $sGrayKey, $sInputKey, $sTempCardKey, $sHelpKey, $sQuitKey' & @CRLF & _
                'Global $ghADVAPI32 = DllOpen("advapi32.dll")' & @CRLF & _
                'Global $ghADVAPI32 = DllOpen("advapi32.dll")' & @CRLF & _
                'Global Const $__WINVER = __Ver()' & @CRLF & _
                'Global $ghADVAPI32 = DllOpen("advapi32.dll")' & @CRLF & _
                'Global Const $DELETE = 0x10000'

$sRer = StringRegExpReplace($sTexs, '(Global\h.+)\r\n(?=[^\1]*\1)', '')
MsgBox(0, '', $sRer)

评分

参与人数 2金钱 +38 收起 理由
Qokelate + 20 谢谢帮忙
user3000 + 18 学习了!

查看全部评分

发表于 2012-7-12 09:01:09 | 显示全部楼层
本帖最后由 user3000 于 2012-7-12 09:10 编辑

回复 4# Qokelate
没考虑其他非 Global 数据, 正解在楼上 -> 木子大人


3楼可能是在吃早餐, 没仔细看帖子, 但楼主4楼的话语是不是也有点粗暴了些?

我看这题解其实可以不用正则. 下面代码里的 StringInStr 最得力. 判断 Global 位置也可以用 StringInStr. 将数据实现按行读取也可以不用正则.
Local $txt = ClipGet()
MsgBox(0, '原来数据', $txt)
$txt = StringRegExp($txt, '.+', 3)
If @error Then Exit
Local $str = ''
For $i = 0 To UBound($txt)-1
        If Not StringRegExp($txt[$i], '^Global\h*') Then ContinueLoop
        If StringInStr($str, $txt[$i]) Then ContinueLoop
        $str &= $txt[$i] &@CRLF
Next
MsgBox(0, '删除后数据', $str)
发表于 2012-7-12 09:06:40 | 显示全部楼层
本帖最后由 user3000 于 2012-7-12 09:10 编辑

没考虑其他非 Global 数据, 正解在楼上 -> 木子大人



6 楼考虑得过了, 直接用数组处理更好:
#include<array.au3>
Local $txt = ClipGet()
MsgBox(0, '原来数据', $txt)
$txt = StringRegExp($txt, '.+', 3)
If @error Then Exit
$txt = _ArrayUnique($txt)
_ArrayDisplay($txt)
发表于 2012-7-12 09:32:22 | 显示全部楼层
本帖最后由 shqf 于 2012-7-12 09:33 编辑

回复 5# 水木子
思路同你,但正则总写不成功,沮丧之余,你已贴上代码。细细品之,亦不懂(?=[^\1]*\1)此部分之意,能否赐教一二?
发表于 2012-7-12 09:46:56 | 显示全部楼层
回复 4# Qokelate


    看错题目了
发表于 2012-7-12 09:51:39 | 显示全部楼层
本帖最后由 afan 于 2012-7-12 10:10 编辑

如果LZ想清除的这些并未牵涉到对于常量的赋值,倒也不算错误,不清除也罢
如果牵涉到常量的赋值,不光是 Global,Local、Dim 都要考虑,而且同行、不同行、多个变量同行但不同序、水平空格形式不同、续行符、函数内的 Global 、Dim 申明等等都要考虑。

想要用脚本来纠错,很不容易。充其量也只能查错,那样的话直接调用 Au3Check.exe 好了
发表于 2012-7-12 10:01:49 | 显示全部楼层
回复 8# shqf

说白了,就是不能和前面匹配的内容相同。

评分

参与人数 1金钱 +10 收起 理由
shqf + 10 谢谢

查看全部评分

 楼主| 发表于 2012-7-12 14:35:14 | 显示全部楼层
本帖最后由 Qokelate 于 2012-7-12 14:48 编辑

回复 10# afan


    正是此意,想通过删除重复行达到无需手工注释常量重定义目的,只是不懂正则,有个模型的话剩下的自己改改就可以了,倒是似乎发现了个新问题使问题更复杂了点

比如   Global Const $a=0x20
          Global Const $a=0x00000020
          Global Const $a=32
这三个赋值语句是等价的,但并非是重复行,不能单纯的删除重复行了 (第三种情况估计正则是没戏了,因为正则无法计算,倒是1,2作为相同行处理是否有可能?)

请教A版有没正则的解决方法?
 楼主| 发表于 2012-7-12 14:53:46 | 显示全部楼层
本帖最后由 Qokelate 于 2012-7-12 14:55 编辑

回复 5# 水木子


    谢谢! 我对比帮助没看懂意思,  不过只匹配Global开头行,我自己改成 ^Global ,不知是不是这样用?
 楼主| 发表于 2012-7-12 14:59:25 | 显示全部楼层
回复 6# user3000

正则的效率比较高,另外如果不用正则的话解决方法很多,只是正则的最简捷

3楼只是一个普通的疑问句而已,是你想多了吧
发表于 2012-7-12 15:03:03 | 显示全部楼层
本帖最后由 水木子 于 2012-7-12 15:06 编辑

回复 12# Qokelate

这种情况!正则同样是可以做到。

范本中建议尽量例举更多会出现的情况,并加以注释说明,这样才方便表达式的编写,以免出现遗漏。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 22:04 , Processed in 0.096478 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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