日期:2014-05-16  浏览次数:20500 次

求个正则表达式的写法
有下面一个字符串,我想用vim替换单词中的空格,但是单词与单词之间的空格需要保留下来。

源字符串:
Timb erland Men's 6" Pr emium Bo ot
Timberl and Women's Wate rproff Boot
Timberland Men's Fiel d Boot
Tim  berland PRO   Premium Boo  t

正确的字符串:
Timberland Men's 6" PremiumBoot
Timberland Women's WaterproffBoot
Timberland Men's Field Boot
Timberland PRO Premium Boot

规律如下:
如果空格两边的字母都是小写字母,那么这个空格应该去掉:[a-z]\s[a-z] ---> [a-z][a-z]
如果空格两边字母有一个是大写的或者数字,那么这个空格是单词与单词之间的分隔符,应该保留。

已经尝试了的方案:
1,全文替换空格,这样会把单词与单词之间的分隔符也替换掉。
2,用vim里面的%s/\<[a-z]\s[a-z]\>//g,失败
正则表达式 vim 空格 替换

------解决方案--------------------
%s/[a-z]\@<=\s\+[a-z]\@=//g
------解决方案--------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script type="text/javascript">
var arr=["Timb erland Men's 6\" Pr emium Bo ot","Timberl and Women's Wate rproff Boot","Timberland Men's Fiel d Boot","Tim  berland PRO   Premium Boo  t"];
var reg=/[a-z]\s+[a-z]/g;
for(var i in arr){
arr[i]=arr[i].replace(reg,change);
}
for(var i in arr){
alert(arr[i]);
}
function change(a){
return a.replace(/\s+/,"");
}
</script>
</head>

<body>
</body>
</html>
这样试试
------解决方案--------------------
var s = "Timb erland Men's 6\" Pr emium Bo ot\n"+
"Timberl and Women's Wate rproff Boot\n"+
"Timberland Men's Fiel d Boot\n"+
"Tim  berland PRO   Premium Boo  t"
var reg = /[a-z]+(\s+)[a-z]/g;
function replace(str){
     if(reg.test(str)){
          str = str.replace(reg,function(){
              return arguments[0].replace(/\s+/,"");
          });
          str = replace(str);
     }
     return str;
}
s = replace(s).replace(/\s{2,}/g," ");
console.log(s);

------解决方案--------------------
var s = (
    "Timb erland Men's 6\" Pr emium Bo ot\n"
  + "Timberl and Women's Wate rproff Boot\n"
  + "Timberland Men's Fiel d Boot\n"
  + "Tim  berland PRO   Premium Boo  t"