在Javascript中将前导空格替换为

在Javascript中将前导空格替换为,javascript,regex,Javascript,Regex,我的文本如下所示,带有嵌入式空格,显示一些xml数据的缩进: &lt;Style id="KMLStyler"&gt;<br> &lt;IconStyle&gt;<br> &lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 所以它看起来像这样: &lt;Style id="KMLStyler"&gt;<br> &a

我的文本如下所示,带有嵌入式空格,显示一些xml数据的缩进:

&lt;Style id="KMLStyler"&gt;<br>
  &lt;IconStyle&gt;<br>
    &lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 
所以它看起来像这样:

&lt;Style id="KMLStyler"&gt;<br>
&nbsp;&nbsp;&lt;IconStyle&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 
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));

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

JavaScript没有方便的\G甚至看起来都不落后,因此没有针对这种AFAIK的纯正则表达式解决方案。像这样的怎么样:

&lt;Style id="KMLStyler"&gt;<br>
&nbsp;&nbsp;&lt;IconStyle&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 
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
此处测试:

编辑 或者用一个匿名的内部函数来做,它叫什么?正如glebm在评论中所评论的:

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

请看这里的实际情况:

JavaScript没有方便的\G甚至看不到落后,因此没有针对此AFAIK的纯正则表达式解决方案。像这样的怎么样:

&lt;Style id="KMLStyler"&gt;<br>
&nbsp;&nbsp;&lt;IconStyle&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;colorMode&gt;normal&lt;/colorMode&gt;<br> 
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
此处测试:

编辑 或者用一个匿名的内部函数来做,它叫什么?正如glebm在评论中所评论的:

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

请参见此处的操作:

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

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

太棒了!我确实必须添加g标志才能使其与\n个字符分隔的多行一起工作;它似乎只是在替换第一行的空格。如果你想编辑你的帖子来添加g,我会接受的@Kevin,啊,是的,我忘记了g修饰符.s.replace/^\s*/mg,functionx{return new Array++x.length.join'}@glebm,是的,看起来很整洁。请注意,*应该替换为+并且因为\s也匹配换行符,所以我选择使用[\t],当然换行符不会匹配。为了清楚起见..我喜欢[\t]b/c,我不希望换行符匹配。我还喜欢它不是一个匿名函数,因为这段代码会被多次调用,我不希望每次都必须创建匿名函数,因为它完全相同,我不确定JS引擎在注意到它是同一个函数并缓存它时有多聪明。太棒了!我确实必须添加g标志才能使其与\n个字符分隔的多行一起工作;它似乎只是在替换第一行的空格。如果你想编辑你的帖子来添加g,我会接受的@Kevin,啊,是的,我忘记了g修饰符.s.replace/^\s*/mg,functionx{return new Array++x.length.join'}@glebm,是的,看起来很整洁。请注意,*应该替换为+并且因为\s也匹配换行符,所以我选择使用[\t],当然换行符不会匹配。为了清楚起见..我喜欢[\t]b/c,我不希望换行符匹配。我还喜欢它不是一个匿名函数,因为这段代码会被多次调用,我不希望每次都必须创建匿名函数,因为它完全相同,我不确定JS引擎是否会注意到它是同一个函数并缓存它。