求教一个正则表达式,有点难度

无·法 社区初级成员 T1 2009-11-12 12:04:35
字符串S实际是一个参数,共有5部分,一般是以空格隔开的,但是空格数目不定。可能是这样几种情况:

1.原型为:-r c:\aa.txt c:\bb.txt QQ qq
希望得到这样5个结果:(1)-r (2)c:\aa.txt (3)c:\bb.txt(4)QQ (5)qq

2.原型为:--r "c:\Program Files\aa.txt" c:\bb.txt QQ qq
希望得到这样5个结果:((1)-r (2)c:\Program Files\aa.txt (3)c:\bb.txt(4)QQ (5)qq

请问有什么办法吗?我能想到的就是:
先将非双引号之间的多个连续空格替换成单个空格
然后再将双引号之间的内容临时替换成一个不含空格的字符
最后按空格分隔得到5个部分,将上面步骤中双引号的东西再还原

不过貌似比较复杂,有简单点的方法吗?正则应该可以一步到位,求教高手。
...全文
107 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
无·法 社区初级成员 T1 2009-11-12
  • 打赏
  • 举报
回复
经过我的潜心研究终于解决了,不过也谢谢各位!
用这个表达式就可以一步搞定了:
(".+?"|.+?)(?:\s+|$)


vb代码:
Private Sub demo()
Dim strData$
Dim reg As Object
Dim matches As Object, match As Object

strData = "r ""c:\Program Files\aa.txt"" ""c:\bb.txt"" QQ qq"
Set reg = CreateObject("vbscript.regexp")
reg.Global = True
reg.IgnoreCase = True
reg.Pattern = "("".+?""|.+?)(?:\s+|$)"

Set matches = reg.Execute(strData)

For Each match In matches
Debug.Print match.SubMatches(0)
Next
End Sub

输出结果:
r
"c:\Program Files\aa.txt"
"c:\bb.txt"
QQ
qq
无·法 社区初级成员 T1 2009-11-12
  • 打赏
  • 举报
回复
啊 各位能不能用vbs的啊 有点小乱
直接替换多个连续空格为单个空格简单\s+?替换成\s就ok了,但是下面这样的情况就不行了,例如:
r "c:\Program Files\aa.txt" c:\bb.txt QQ qq
替换后就变成了:
r "c:\Program Files\aa.txt" c:\bb.txt QQ qq
其中的引号部分是作为一个整体不能做改变的,大家应该可以理解,因为它是一个文件路径。
嘟嘟xo 2009-11-12
  • 打赏
  • 举报
回复
try..
<script type="text/javascript">
<!--
var result=[];
var str = '-r "c:\\Program Files\\aa.txt" "MM mm" c:\\bb.txt QQ qq';
str=str.replace(/([ ]*[^ "]+[ ]*)|("[^"]+")/gi,function(val){
result.push(val.replace(/^[ "]+|[ "]+$/gi,""));
});
alert(result);
//-->
</script>
嘟嘟xo 2009-11-12
  • 打赏
  • 举报
回复
整错了~先该说的是,楼上都有问题~~
[Quote=引用 4 楼 click_me 的回复:]
JScript code
不是分离不分离 这里稍微麻烦点的就是""中间的空格给排除掉
[/Quote]
这个是重点~
嘟嘟xo 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sohighthesky 的回复:]
引用 1 楼 zengzhan 的回复:
用分离函数很简单的啊  先把不规则的空格转化为一个空格  然后分离就容易了

up
JScript codevar getV=function(str) {
str=str.split('');for(var i=0,res=[];i<str.length;i++) {var cur=str[i];if(cur)
res.push(cur);
}return res;
}var str="-r c:\aa.txt c:\bb.txt QQ qq";
alert(getV(str));
[/Quote]
这个是重点~
Click_Me 2009-11-12
  • 打赏
  • 举报
回复

不是分离不分离 这里稍微麻烦点的就是 " "中间的空格给排除掉
sohighthesky 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zengzhan 的回复:]
用分离函数很简单的啊  先把不规则的空格转化为一个空格  然后分离就容易了
[/Quote]
up

var getV=function(str) {
str=str.split(' ');
for(var i=0,res=[];i<str.length;i++) {
var cur=str[i];
if(cur)
res.push(cur);
}
return res;
}
var str="-r c:\aa.txt c:\bb.txt QQ qq ";
alert(getV(str));
Click_Me 2009-11-12
  • 打赏
  • 举报
回复

<script type="text/javascript">
<!--
var str = '-r "c:\Program Files\aa.txt" c:\\bb.txt QQ qq';
str = str.split(/\s+(?!\w.*\")/);
alert(str);
//-->
</script>
qqzeng-ip 2009-11-12
  • 打赏
  • 举报
回复
用分离函数很简单的啊 先把不规则的空格转化为一个空格 然后分离就容易了

87,920

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧