已解决 用正则怎样删除以Global开头的重复行
本帖最后由 Qokelate 于 2012-7-12 15:43 编辑对于以Global开头的重复的行,只保留第一次出现那行,其它重复的行删除,用正则怎样写?
目的达成见5L 本帖最后由 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
(?im)^Global.+ 回复 3# haijie1223
没看清楚题目?还是我没表达清楚? 回复 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: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: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:33 编辑
回复 5# 水木子
思路同你,但正则总写不成功,沮丧之余,你已贴上代码。细细品之,亦不懂(?=[^\1]*\1)此部分之意,能否赐教一二? 回复 4# Qokelate
看错题目了 本帖最后由 afan 于 2012-7-12 10:10 编辑
如果LZ想清除的这些并未牵涉到对于常量的赋值,倒也不算错误,不清除也罢
如果牵涉到常量的赋值,不光是 Global,Local、Dim 都要考虑,而且同行、不同行、多个变量同行但不同序、水平空格形式不同、续行符、函数内的 Global 、Dim 申明等等都要考虑。
想要用脚本来纠错,很不容易。充其量也只能查错,那样的话直接调用 Au3Check.exe 好了 回复 8# shqf
说白了,就是不能和前面匹配的内容相同。 本帖最后由 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:55 编辑
回复 5# 水木子
谢谢! 我对比帮助没看懂意思,不过只匹配Global开头行,我自己改成 ^Global ,不知是不是这样用? 回复 6# user3000
正则的效率比较高,另外如果不用正则的话解决方法很多,只是正则的最简捷
3楼只是一个普通的疑问句而已,是你想多了吧 本帖最后由 水木子 于 2012-7-12 15:06 编辑
回复 12# Qokelate
这种情况!正则同样是可以做到。
范本中建议尽量例举更多会出现的情况,并加以注释说明,这样才方便表达式的编写,以免出现遗漏。
页:
[1]
2