用Javascript替换前导空格

时间:2010-12-23 20:11:31

标签: javascript regex

我有类似下面的文本,其中嵌入的空格显示了某些xml数据的缩进:

&lt;Style id="KMLStyler"&gt;<br>
  &lt;IconStyle&gt;<br>
    &lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 

我需要使用Javascript用

替换每个LEADING空间
&nbsp;

所以它看起来像这样:

&lt;Style id="KMLStyler"&gt;<br>
&nbsp;&nbsp;&lt;IconStyle&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 

我尝试过基本替换,但它匹配所有空格,而不仅仅是前导空格。除了领先的那些,我想留下所有的空间。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

JavaScript没有方便的\G(甚至不是后视),所以这个AFAIK没有纯正的正则表达式解决方案。这样的事情怎么样:

function foo() {
  var leadingSpaces = arguments[0].length;
  var str = '';
  while(leadingSpaces > 0) {
    str += '&nbsp;';
    leadingSpaces--;
  }
  return str;
}

var s = "   A B C";
print(s.replace(/^[ \t]+/mg, foo));

产生:

&nbsp;&nbsp;&nbsp;A B C

在这里测试:http://ideone.com/XzLCR

修改

或者使用匿名内部函数(它被称为?),如评论中的glebm所评论:

var s = "   A B C";
print(s.replace(/^[ \t]+/gm, function(x){ return new Array(x.length + 1).join('&nbsp;') }));

在此处查看 http://ideone.com/3JU52

答案 1 :(得分:1)

使用^将模式锚定在字符串的开头,或者如果您处理多行字符串(即:嵌入的换行符),则将\n添加到模式中。您需要一次匹配整个前导空格集,然后在替换中检查匹配的长度以确定要插入多少个nbsps。