找回密码
 加入
搜索
查看: 8162|回复: 18

[AU3基础] 求个正则,解决路径中带空格的问题

 火.. [复制链接]
发表于 2011-3-10 19:36:23 | 显示全部楼层 |阅读模式
很多情况下,带空格的路径都会有错误,需要加引号搞定,手动添加又比较麻烦,所以求个正则,解决这个问题,高手帮忙,下面是例子
一个路径,如果某段中间有空格,将有空格的部分两边加上引号
比如,C:\Documents and Settings\All Users\D RM
变成,C:\"Documents and Settings"\"All Users"\"D RM"
谢谢~~
发表于 2011-3-10 19:51:58 | 显示全部楼层
直接"C:\Documents and Settings\All Users\D RM"就可以了
不需要判断了吧,所有的路径全部加上引号,不管有没有空格。
发表于 2011-3-10 20:07:10 | 显示全部楼层
$s='C:\Documents and Settings\All Users\D RM'
$s=StringSplit($s,"",2)
$outstring=''
For $i=0 To UBound($s)-1
        If StringInStr($s[$i],' ') Then $s[$i]='"'&$s[$i]&'"'
        $outstring&=$s[$i]&'\'
Next
MsgBox(0,0,StringTrimRight($outstring,1))
何必呢 用字符串函数不是更简单?
发表于 2011-3-10 20:08:08 | 显示全部楼层
本帖最后由 水木子 于 2011-3-10 20:13 编辑

就当正则练习题吧!
$sText = 'C:\Documents and Settings\All Users\D RM'
$sRer = StringRegExpReplace($sText, '(?<=\\)(\H+\h+[^\\\r]+)', '"$1"')
MsgBox(0, '', $sRer)

评分

参与人数 1金钱 +30 收起 理由
lixiaolong + 30 牛!

查看全部评分

 楼主| 发表于 2011-3-16 15:53:52 | 显示全部楼层
就当正则练习题吧!
水木子 发表于 2011-3-10 20:08



   
有些错误,比如C:\Documents and Settings\Administrator\My Documents
得到的结果是C:\"Documents and Settings"\"Administrator\My Documents"
求更正
发表于 2011-3-16 16:33:10 | 显示全部楼层
$sText = 'C:\Documents and Settings\All Users\D RM'
$sRer = StringRegExpReplace($sText, '(([^\\]* +)+[^\\]*)', '"$1"')
MsgBox(0, '', $sRer)
那我也练一下
发表于 2011-3-16 16:56:35 | 显示全部楼层
本帖最后由 easefull 于 2011-3-16 17:56 编辑

正则练手
$sString  = 'C:\Documents and Settings\Administrator\My Documents'
$sString &= @CR
$sString  = StringRegExpReplace($sString, '(?<=\\)([^\\]*\s[^\\]*)(?=([\\|\r]))', '"' & '$1' &'"')
MsgBox(4096, "", $sString)
思路:
在路径结尾添加@cr
使用零宽断言匹配 (\开头) And (\ or @cr)结尾,并且中间至于有一个空格的字符串
最后再去掉@cr
发表于 2011-3-16 17:14:52 | 显示全部楼层
本帖最后由 easefull 于 2011-3-16 17:56 编辑

学习吸收第4楼的代码.吸收'"$1"'
$sTexts = 'C:\Documents and Settings\Administrator\My Documents'
$sTexts = StringStripCR($sTexts) & @CR
$sTexts = StringStripCR(StringRegExpReplace($sTexts, '(?<=\\)([^\\]*\s[^\\]*)(?=([\\|\r]))', '"$1"'))
MsgBox(4096, "", $sTexts)
发表于 2011-3-16 17:16:34 | 显示全部楼层
回复 5# dearmb

$sText = 'C:\Documents and Settings\Administrator\My Documents'
$sRer = StringRegExpReplace($sText, '(?<=\\)([^\\]*\h+[^\\]*)', '"$1"')
MsgBox(0, '', $sRer)
发表于 2011-3-16 17:52:42 | 显示全部楼层
本帖最后由 easefull 于 2011-3-16 17:54 编辑
$sTexts = 'C:\Documents and Settings\Administrator\My Documents'
$sTexts = StringRegExpReplace($sTexts, '([^\\]*\s[^\\]*)', '"$1"')
MsgBox(4096, "", $sTexts)
此代码源于6楼的思路,比我的思路好得太多了- -!
思路:
以\为间隔拆分字符串.
匹配中间包含至少一个空格的字符串,使之加上双引号.
发表于 2011-3-16 18:13:49 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-3-16 18:27 编辑

借用水木子版主的正则(加了 \r)
(?<=\\)([^\\]*\h+[^\\\r]+); 支持多行
 楼主| 发表于 2011-3-16 18:22:16 | 显示全部楼层
我晕了……你们这么多练手的,我都不知道选哪个好了……
发表于 2011-3-19 14:12:09 | 显示全部楼层
你们用的正则对楼主上面的那个目录来说是足够了
但是我认为这些不是最合理的
我的思路是
1、先提取\\之后的部分
2、在提取部分前面后面加上\
3、提取\与\中间的部分
4、前面后面加上"
其实第四步用字符串处理更好,呵呵
发表于 2011-3-19 14:17:56 | 显示全部楼层
还有9楼水木子前辈 中间的\h+有很大的问题
发表于 2011-3-19 14:32:22 | 显示全部楼层
我认为领款断言的时候应该是:后面的部分
判断方式为:
前面必须是\ 并且后面不能有\
正则我也是刚学不久,我希望不要因为我没把我理想表达式写出来埋怨我
我只是想跟大家探讨一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 11:35 , Processed in 0.099647 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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