dearmb 发表于 2011-3-10 19:36:23

求个正则,解决路径中带空格的问题

很多情况下,带空格的路径都会有错误,需要加引号搞定,手动添加又比较麻烦,所以求个正则,解决这个问题,高手帮忙,下面是例子
一个路径,如果某段中间有空格,将有空格的部分两边加上引号
比如,C:\Documents and Settings\All Users\D RM
变成,C:\"Documents and Settings"\"All Users"\"D RM"
谢谢~~

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

dearmb 发表于 2011-3-16 15:53:52

就当正则练习题吧!
水木子 发表于 2011-3-10 20:08 http://autoitx.com/images/common/back.gif


   
有些错误,比如C:\Documents and Settings\Administrator\My Documents
得到的结果是C:\"Documents and Settings"\"Administrator\My Documents"
求更正

kevinch 发表于 2011-3-16 16:33:10

$sText = 'C:\Documents and Settings\All Users\D RM'
$sRer = StringRegExpReplace($sText, '(([^\\]* +)+[^\\]*)', '"$1"')
MsgBox(0, '', $sRer)那我也练一下

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

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

easefull 发表于 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楼的思路,比我的思路好得太多了- -!
思路:
以\为间隔拆分字符串.
匹配中间包含至少一个空格的字符串,使之加上双引号.

lixiaolong 发表于 2011-3-16 18:13:49

本帖最后由 lixiaolong 于 2011-3-16 18:27 编辑

借用水木子版主的正则(加了 \r)
(?<=\\)([^\\]*\h+[^\\\r]+); 支持多行

dearmb 发表于 2011-3-16 18:22:16

我晕了……你们这么多练手的,我都不知道选哪个好了……

love5173 发表于 2011-3-19 14:12:09

你们用的正则对楼主上面的那个目录来说是足够了
但是我认为这些不是最合理的
我的思路是
1、先提取\\之后的部分
2、在提取部分前面后面加上\
3、提取\与\中间的部分
4、前面后面加上"
其实第四步用字符串处理更好,呵呵

love5173 发表于 2011-3-19 14:17:56

还有9楼水木子前辈 中间的\h+有很大的问题

love5173 发表于 2011-3-19 14:32:22

我认为领款断言的时候应该是:后面的部分
判断方式为:
前面必须是\ 并且后面不能有\
正则我也是刚学不久,我希望不要因为我没把我理想表达式写出来埋怨我
我只是想跟大家探讨一下
页: [1] 2
查看完整版本: 求个正则,解决路径中带空格的问题