找回密码
 加入
搜索
查看: 934|回复: 9

[AU3基础] 【已解决】正则表达式提取盘符及路径

[复制链接]
发表于 2022-3-13 17:19:10 | 显示全部楼层 |阅读模式
本帖最后由 chishingchan 于 2022-3-13 21:27 编辑

原字符串:C:\Users\Administrator\Desktop

求助1:正则表达式提取原字符串为 C:

求助2:正则表达式提取原字符串为 \Users\Administrator\Desktop

谢谢!

--------题外话--------
建议高手另开一个正则表达式的贴子:
文件字符串:$String = "C:\Users\Administrator\Desktop\desktop.ini"
提取 "C" 正则表达式为
提取 "C:" 正则表达式为
提取 ":\Users\Administrator\Desktop" 正则表达式为
提取 "\Users\Administrator\Desktop" 正则表达式为
提取 ":\Users\Administrator\Desktop\" 正则表达式为
提取 "\Users\Administrator\Desktop\" 正则表达式为
提取 ":\Users\Administrator\Desktop\desktop.ini" 正则表达式为
提取 "\Users\Administrator\Desktop\desktop.ini"" 正则表达式为
提取 "desktop.ini" 正则表达式为
提取 "desktop" 正则表达式为
提取 ".ini" 正则表达式为
提取 "ini" 正则表达式为

文件夹字符串:$String = "C:\Users\Administrator\Desktop"
提取 "C" 正则表达式为
提取 "C:" 正则表达式为
提取 ":\Users\Administrator\Desktop" 正则表达式为
提取 "\Users\Administrator\Desktop" 正则表达式为

提取 ":\Users\Administrator" 正则表达式为
提取 "\Users\Administrator" 正则表达式为

提取 ":\Users\Administrator\" 正则表达式为
提取 "\Users\Administrator\" 正则表达式为



发表于 2022-3-13 17:30:55 | 显示全部楼层
Highlight code by AuREHelper
(\w:)(\V+)


一个表达式就行了
发表于 2022-3-13 17:53:55 | 显示全部楼层
本帖最后由 afan 于 2022-3-13 18:13 编辑

文件字符串:$String = "C:\Users\Administrator\Desktop\desktop.ini"
提取 "C" 正则表达式为
Highlight code by AuREHelper
^(\w)(?=:)
提取 "C:" 正则表达式为
Highlight code by AuREHelper
^(\w:)
提取 ":\Users\Administrator\Desktop" 正则表达式为
Highlight code by AuREHelper
^\w(:\V+)\\[^\\](?#)+$
提取 "\Users\Administrator\Desktop" 正则表达式为
Highlight code by AuREHelper
^\w:(\V+)\\[^\\](?#)+$
提取 ":\Users\Administrator\Desktop\" 正则表达式为
Highlight code by AuREHelper
^\w(:\V+\\)[^\\](?#)+$
提取 "\Users\Administrator\Desktop\" 正则表达式为
Highlight code by AuREHelper
^\w:(\V+\\)[^\\](?#)+$
提取 ":\Users\Administrator\Desktop\desktop.ini" 正则表达式为
Highlight code by AuREHelper
^\w(:\V+)$
提取 "\Users\Administrator\Desktop\desktop.ini"" 正则表达式为
Highlight code by AuREHelper
^\w:(\V+)$
提取 "desktop.ini" 正则表达式为
Highlight code by AuREHelper
^\w:\V+\\([^\\](?#)+)$
提取 "desktop" 正则表达式为
Highlight code by AuREHelper
^\w:\V+\\([^\\](?#)+)\.\w{2,4}$
提取 ".ini" 正则表达式为
Highlight code by AuREHelper
\.\w{2,4}$
提取 "ini" 正则表达式为
Highlight code by AuREHelper
\.(\w{2,4})$

这是针对本身是合法路径的,写法很简单,而且也可以有很多种不同写法。
如果不一定是合法路径,那就要做出多种检验,写法也会复杂一些。
另外,这种路径一般用一个表达式就行了,然后自行组合使用,如
Highlight code by AuREHelper
^(\w):\\(\V+)\\([^\\](?#)+)\.(\w{2,4})$


(注:以上有一些(?#)标记,这个本身是用于在表达式做注释用的,不参与表达式。此处的作用只是应对论坛对于html代码的Bug而必须加的,可以忽略)

后面文件夹示例基本一样,去掉 \.\w{2,4} 就行了




评分

参与人数 1金钱 +100 收起 理由
chishingchan + 100 很给力!

查看全部评分

 楼主| 发表于 2022-3-13 20:19:17 | 显示全部楼层
a大,打扰了!上面的结果不够直观,结果如下:


我想要的结果如下:


麻烦你改一改,实在看不懂。谢谢!
$hGUI = GUICreate("正则表达式演示",640,320)

$String = "C:\Users\Administrator\Desktop"
GUICtrlCreateLabel("$String = 'C:\Users\Administrator\Desktop'",10,10)

GUICtrlCreateLabel("正则表达式",10,30)
GUICtrlCreateLabel("返回结果",430,30)

GUICtrlCreateInput("StringRegExpReplace($String, '^(\w)(?=:)','')",10,50,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^(\w)(?=:)',''),430,50,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^(\w:)','')",10,70,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^(\w:)',''),430,70,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w(:\V+)\\[^\\](?#)+$','')",10,90,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^\w(:\V+)\\[^\\](?#)+$',''),430,90,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w:(\V+)\\[^\\](?#)+$','')",10,110,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^\w:(\V+)\\[^\\](?#)+$',''),430,110,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w(:\V+\\)[^\\](?#)+$','')",10,130,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^\w(:\V+\\)[^\\](?#)+$',''),430,130,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w:(\V+\\)[^\\](?#)+$','')",10,150,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^^\w:(\V+\\)[^\\](?#)+$',''),430,150,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w(:\V+)$','')",10,170,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^\w(:\V+)$',''),430,170,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w:\V+\\([^\\](?#)+)$','')",10,190,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^\w:\V+\\([^\\](?#)+)$',''),430,190,200)

GUICtrlCreateInput("StringRegExpReplace($String, '^\w:\V+\\([^\\](?#)+)\.\w{2,4}$','')",10,190,410)
GUICtrlCreateInput(StringRegExpReplace($String,'^\w:\V+\\([^\\](?#)+)\.\w{2,4}$',''),430,190,200)

GUICtrlCreateInput("StringRegExpReplace($String, '\.\w{2,4}$','')",10,190,410)
GUICtrlCreateInput(StringRegExpReplace($String,'\.\w{2,4}$',''),430,190,200)

GUICtrlCreateInput("StringRegExpReplace($String, '\.(\w{2,4})$','')",10,190,410)
GUICtrlCreateInput(StringRegExpReplace($String,'\.(\w{2,4})$',''),430,190,200)

GUISetState(@SW_SHOW, $hGUI)

While 1
        Switch GUIGetMsg()
                Case -3
                        ExitLoop
        EndSwitch
WEnd


本帖子中包含更多资源

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

×
 楼主| 发表于 2022-3-13 20:22:40 | 显示全部楼层
afan 发表于 2022-3-13 17:53
文件字符串:$String = "C:%users\Administrator\Desktop\desktop.ini"
提取 "C" 正则表达式为 提取 "C:"  ...

麻烦看看 4# ,谢谢!
发表于 2022-3-13 20:26:07 | 显示全部楼层
chishingchan 发表于 2022-3-13 20:22
麻烦看看 4# ,谢谢!

我上面写的都是匹配方式 StringRegExp,不是替换模式 StringRegExpReplace
发表于 2022-3-13 20:53:41 | 显示全部楼层
$hGUI = GUICreate("正则表达式演示", 640, 320)

$String = "C:\Users\Administrator\Desktop"
GUICtrlCreateLabel("$String = 'C:\Users\Administrator\Desktop'", 10, 10)

GUICtrlCreateLabel("正则表达式", 10, 30)
GUICtrlCreateLabel("返回结果", 430, 30)
$sExp = "StringRegExp($String, '^(\w)(?=:)',1)[0]"
GUICtrlCreateInput($sExp, 10, 50, 410)
GUICtrlCreateInput(Execute($sExp), 430, 50, 200)
$sExp = "StringRegExp($String, '^(\w:)', 1)[0]"
GUICtrlCreateInput($sExp, 10, 70, 410)
GUICtrlCreateInput(Execute($sExp), 430, 70, 200)
$sExp = "StringRegExp($String, '^\w(:\V+)\\[^\\](?#)+$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 90, 410)
GUICtrlCreateInput(Execute($sExp), 430, 90, 200)
$sExp = "StringRegExp($String, '^\w:(\V+)\\[^\\](?#)+$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 110, 410)
GUICtrlCreateInput(Execute($sExp), 430, 110, 200)
$sExp = "StringRegExp($String, '^\w(:\V+\\)[^\\](?#)+$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 130, 410)
GUICtrlCreateInput(Execute($sExp), 430, 130, 200)
$sExp = "StringRegExp($String, '^\w:(\V+\\)[^\\](?#)+$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 150, 410)
GUICtrlCreateInput(Execute($sExp), 430, 150, 200)
$sExp = "StringRegExp($String, '^\w(:\V+)$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 170, 410)
GUICtrlCreateInput(Execute($sExp), 430, 170, 200)
$sExp = "StringRegExp($String, '^\w:\V+\\([^\\](?#)+)$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 190, 410)
GUICtrlCreateInput(Execute($sExp), 430, 190, 200)
$sExp = "StringRegExp($String, '^\w:\V+\\([^\\](?#)+)(?:\.\w{2,4})?$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 210, 410)
GUICtrlCreateInput(Execute($sExp), 430, 210, 200)
$sExp = "StringRegExp($String, '(?:\.\w{2,4})?$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 230, 410)
GUICtrlCreateInput(Execute($sExp), 430, 230, 200)
$sExp = "StringRegExp($String, '(?:\.(\w{2,4}))?$', 1)[0]"
GUICtrlCreateInput($sExp, 10, 250, 410)
GUICtrlCreateInput(Execute($sExp), 430, 250, 200)

GUISetState()

While GUIGetMsg() <> -3
WEnd

评分

参与人数 1金钱 +100 收起 理由
chishingchan + 100 那语句搜索抄来的,没注意看,抄错了。

查看全部评分

发表于 2022-3-14 15:07:27 | 显示全部楼层
_PathSplit 这函数 中找。



; #FUNCTION# ====================================================================================================================
; Author ........: Valik
; Modified.......: DXRW4E - Re-wrote to use a regular expression; guinness - Update syntax and structure.
; ===============================================================================================================================
Func _PathSplit($sFilePath, ByRef $sDrive, ByRef $sDir, ByRef $sFileName, ByRef $sExtension)
        Local $aArray = StringRegExp($sFilePath, "^\h*((?:\\\\\?\\)*(\\\\[^\?\/\\]+|[A-Za-z]:)?(.*[\/\\]\h*)?((?:[^\.\/\\]|(?(?=\.[^\/\\]*\.)\.))*)?([^\/\\]*))$", $STR_REGEXPARRAYMATCH)
        If @error Then ; This error should never happen.
                ReDim $aArray[5]
                $aArray[$PATH_ORIGINAL] = $sFilePath
        EndIf
        $sDrive = $aArray[$PATH_DRIVE]
        If StringLeft($aArray[$PATH_DIRECTORY], 1) == "/" Then
                $sDir = StringRegExpReplace($aArray[$PATH_DIRECTORY], "\h*[\/\\]+\h*", "\/")
        Else
                $sDir = StringRegExpReplace($aArray[$PATH_DIRECTORY], "\h*[\/\\]+\h*", "\\")
        EndIf
        $aArray[$PATH_DIRECTORY] = $sDir
        $sFileName = $aArray[$PATH_FILENAME]
        $sExtension = $aArray[$PATH_EXTENSION]

        Return $aArray
EndFunc   ;==>_PathSplit
 楼主| 发表于 2022-3-14 17:05:42 | 显示全部楼层
本帖最后由 chishingchan 于 2022-3-14 17:06 编辑
绿色风 发表于 2022-3-14 15:07
_PathSplit 这函数 中找。

$PATH_... 这些变量好像没有被 定义
可不可以发个能显示结果的例子?谢谢!
发表于 2022-3-14 18:36:25 | 显示全部楼层
chishingchan 发表于 2022-3-14 17:05
$PATH_... 这些变量好像没有被 定义
可不可以发个能显示结果的例子?谢谢!

帮助文档中的呀,万能的F1 不就出来的了。
指向: file.au3
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-3 20:19 , Processed in 0.076941 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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