Qokelate 发表于 2012-7-12 04:33:11

已解决 用正则怎样删除以Global开头的重复行

本帖最后由 Qokelate 于 2012-7-12 15:43 编辑

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

目的达成见5L

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

haijie1223 发表于 2012-7-12 08:03:24

(?im)^Global.+

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

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

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

shqf 发表于 2012-7-12 09:32:22

本帖最后由 shqf 于 2012-7-12 09:33 编辑

回复 5# 水木子
思路同你,但正则总写不成功,沮丧之余,你已贴上代码。细细品之,亦不懂(?=[^\1]*\1)此部分之意,能否赐教一二?

haijie1223 发表于 2012-7-12 09:46:56

回复 4# Qokelate


    看错题目了

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

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

Qokelate 发表于 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版有没正则的解决方法?

Qokelate 发表于 2012-7-12 14:53:46

本帖最后由 Qokelate 于 2012-7-12 14:55 编辑

回复 5# 水木子


    谢谢! 我对比帮助没看懂意思,不过只匹配Global开头行,我自己改成 ^Global ,不知是不是这样用?

Qokelate 发表于 2012-7-12 14:59:25

回复 6# user3000

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

3楼只是一个普通的疑问句而已,是你想多了吧

水木子 发表于 2012-7-12 15:03:03

本帖最后由 水木子 于 2012-7-12 15:06 编辑

回复 12# Qokelate

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

范本中建议尽量例举更多会出现的情况,并加以注释说明,这样才方便表达式的编写,以免出现遗漏。
页: [1] 2
查看完整版本: 已解决 用正则怎样删除以Global开头的重复行