找回密码
 加入
搜索
查看: 1847|回复: 30

[AU3基础] 【已解决】注册表键的正则表达式

[复制链接]
发表于 2022-8-24 20:55:29 | 显示全部楼层 |阅读模式
本帖最后由 chishingchan 于 2022-8-25 09:31 编辑

例如:
1、[HKEY_LOCAL_MACHINE\SYSTEM\...]
2、[-HKEY_LOCAL_MACHINE\SYSTEM\...]


求1和2的正则表达式,但1不能包含2的类型,谢谢!


发表于 2022-8-24 21:11:37 | 显示全部楼层
#include <Array.au3>
Local $sSource = _
                '[HKEY_LOCAL_MACHINE\SYSTEM\...]' & @CRLF & _
                '[-HKEY_LOCAL_MACHINE\SYSTEM\...]'
;~ MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '(?mi)^\h*(\[h.+\])', 3)                ;1
;~ Local $aSRE = StringRegExp($sSource, '(?mi)^\h*(\[-h.+\])', 3)                ;2
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])
_ArrayDisplay($aSRE, UBound($aSRE))

评分

参与人数 1威望 +2 金钱 +50 收起 理由
chishingchan + 2 + 50 很给力!

查看全部评分

 楼主| 发表于 2022-8-25 09:30:33 | 显示全部楼层
1、StringRegExp("字符串", '(?mi)^\h*(\[h.+\])', 3)
2、StringRegExp("字符串", '(?mi)^\h*(\[-h.+\])', 3)
 楼主| 发表于 2022-8-25 19:02:30 | 显示全部楼层

结贴结早了!再次求助,谢谢!
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM]
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001]
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control]
"PreshutdownOrder"=hex(7):77,00,75,00,61,00,75,00,73,00,65,00,72,00,76,00,00,\
  00,67,00,70,00,73,00,76,00,63,00,00,00,74,00,72,00,75,00,73,00,74,00,65,00,\
  64,00,69,00,6e,00,73,00,74,00,61,00,6c,00,6c,00,65,00,72,00,00,00,00,00
"WaitToKillServiceTimeout"="12000"
"CurrentUser"="USERNAME"
"BootDriverFlags"=dword:00000000
"ServiceControlManagerExtension"=hex(2):25,00,73,00,79,00,73,00,74,00,65,00,6d,\
  00,72,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,\
  33,00,32,00,5c,00,73,00,63,00,65,00,78,00,74,00,2e,00,64,00,6c,00,6c,00,00,\
  00
"SystemStartOptions"=" NOEXECUTE=OPTIN"
"SystemBootDevice"="multi(0)disk(0)rdisk(0)partition(2)"
"FirmwareBootDevice"="multi(0)disk(0)rdisk(0)partition(1)"

我已将这个 reg 读取为字符串,我的用意是:
[若干字符串] & @CRLF & "[" 替换成  "[",即是需要删除两行:
[HKEY_LOCAL_MACHINE\SYSTEM]
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001]
如果前面带减号的,例如:[-HKEY_LOCAL_MACHINE\SYSTEM],即不需要处理。
你给的正则可能只适用于单行,希望a大帮忙改进。谢谢!
发表于 2022-8-25 19:25:11 | 显示全部楼层
chishingchan 发表于 2022-8-25 19:02
结贴结早了!再次求助,谢谢!

Local $sSRERe = StringRegExpReplace($sSource, '(?mi)(?:^\h*\[h\V+\R+)+(?=\h*\[)', '')

评分

参与人数 1威望 +2 金钱 +50 收起 理由
chishingchan + 2 + 50 太棒了!完全符合要求。谢谢!

查看全部评分

 楼主| 发表于 2022-8-26 16:12:44 | 显示全部楼层
看来要好好的学习正则才是硬道理!
发表于 2022-8-26 16:17:31 | 显示全部楼层
chishingchan 发表于 2022-8-26 16:12
看来要好好的学习正则才是硬道理!

学一小段时间,只要一段时间不用就忘,要时不时搞一下,时不时回顾才想得起来。
 楼主| 发表于 2022-8-26 19:37:27 | 显示全部楼层
holley 发表于 2022-8-26 16:17
学一小段时间,只要一段时间不用就忘,要时不时搞一下,时不时回顾才想得起来。

下了一本《精通正则表达式》第三版.pdf 慢慢学。老是问A大,问多了也不好意思!
发表于 2022-8-26 22:40:46 | 显示全部楼层
chishingchan 发表于 2022-8-26 19:37
下了一本《精通正则表达式》第三版.pdf 慢慢学。老是问A大,问多了也不好意思!

举手之劳,无需多虑~
发表于 2022-8-28 14:47:47 | 显示全部楼层
正则真是个好东西,但是很难。
 楼主| 发表于 2022-8-28 21:21:02 | 显示全部楼层
本帖最后由 chishingchan 于 2022-8-28 21:23 编辑
afan 发表于 2022-8-26 22:40
举手之劳,无需多虑~

请a大帮忙完成这个测试正则表达式的小程序,谢谢!


Local $hGUI = GUICreate("正则表达式练习", 640, 480)
Local $E1 = GUICtrlCreateEdit("", 10, 10, 620, 240)
Local $I1 = GUICtrlCreateInput("", 10, 260, 490, 20)
Local $I2 = GUICtrlCreateInput("", 10, 290, 490, 20)
Local $SRE = GUICtrlCreateButton("StringRegExp", 510, 258)
Local $SRER = GUICtrlCreateButton("StringRegExpReplace", 510, 288)
Local $E2 = GUICtrlCreateEdit("", 10, 320, 620, 150)
GUISetState(@SW_SHOW, $hGUI)
While 1
        Switch GUIGetMsg()
                Case -3
                        Exit
                Case $SRE
                        If StringLen(GUICtrlRead($E1)) > 0 And StringLen(GUICtrlRead($I1)) > 0 Then
                                GUICtrlSetData($E2, StringRegExp(GUICtrlRead($E1), GUICtrlRead($I1)))
                        Else
                                MsgBox(16, "错误", "请补充数据!", 3)
                        EndIf
                Case $SRER
                        If StringLen(GUICtrlRead($E1)) > 0 And StringLen(GUICtrlRead($I1)) > 0 Then
                                GUICtrlSetData($E2, StringRegExpReplace(GUICtrlRead($E1), GUICtrlRead($I1), GUICtrlRead($I2)))
                        Else
                                MsgBox(16, "错误", "请补充数据!", 3)
                        EndIf
        EndSwitch
WEnd
GUIDelete($hGUI)
测试注册表:
Windows Registry Editor Version 5.00

; 由 Total Uninstall 产生


[HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip]
"Path"="C:\\Program Files\\7-Zip\"
"Path32"="C:\\Program Files\\7-Zip\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\7-Zip]
@="{23170F69-40C1-278A-1000-000100020000}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}]
@="7-Zip Shell Extension"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32]
@="C:\\Program Files\\7-Zip\\7-zip.dll"
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\7-Zip]
@="{23170F69-40C1-278A-1000-000100020000}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shellex\DragDropHandlers]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shellex\DragDropHandlers\7-Zip]
@="{23170F69-40C1-278A-1000-000100020000}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shellex\DragDropHandlers]

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shellex\DragDropHandlers\7-Zip]
@="{23170F69-40C1-278A-1000-000100020000}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shellex\ContextMenuHandlers\7-Zip]
@="{23170F69-40C1-278A-1000-000100020000}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe]
@="C:\\Program Files\\7-Zip\\7zFM.exe"
"Path"="C:\\Program Files\\7-Zip\"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
"{23170F69-40C1-278A-1000-000100020000}"="7-Zip Shell Extension"

[HKEY_USERS\S-1-5-21-776561741-583907252-1801674531-500\Software\7-Zip]
"Path"="C:\\Program Files\\7-Zip\"
"Path32"="C:\\Program Files\\7-Zip\"

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2022-8-28 21:28:56 | 显示全部楼层
注册表处理方案:
删除空行;
删除 [*] 下没有数据的行,忽略以 [- 开头的行;
另外(可选)删除以 ; 开头的注释行
发表于 2022-8-28 21:33:53 | 显示全部楼层
chishingchan 发表于 2022-8-28 21:21
请a大帮忙完成这个测试正则表达式的小程序,谢谢!

怎么完成?你这不已经完成了
发表于 2022-8-28 21:42:09 | 显示全部楼层
本帖最后由 afan 于 2022-8-28 22:01 编辑
chishingchan 发表于 2022-8-28 21:28
注册表处理方案:
删除空行;
删除 下没有数据的行,忽略以 [- 开头的行;

删除空行
Local $sSRERe =StringRegExpReplace($sSource, '\R+\h*(?=\R)', '')

删除[]下没有数据的行,忽略以 [- 开头的行
之前 5# 的代码

删除以 ; 开头的注释行
Local $sSRERe = StringRegExpReplace($sSource, '(?m)^\h*;\V*\R*', '')

评分

参与人数 1威望 +2 金钱 +100 贡献 +10 收起 理由
chishingchan + 2 + 100 + 10 很给力!

查看全部评分

 楼主| 发表于 2022-8-29 14:46:01 | 显示全部楼层
afan 发表于 2022-8-28 21:33
怎么完成?你这不已经完成了

点按钮之后,上下框内容相同!希望你优化一下代码
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-27 10:29 , Processed in 0.080789 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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