在Javascript中将前导空格替换为
我的文本如下所示,带有嵌入式空格,显示一些xml数据的缩进:在Javascript中将前导空格替换为,javascript,regex,Javascript,Regex,我的文本如下所示,带有嵌入式空格,显示一些xml数据的缩进: <Style id="KMLStyler"><br> <IconStyle><br> <colorMode>normal</colorMode><br> 所以它看起来像这样: <Style id="KMLStyler"><br> &a
<Style id="KMLStyler"><br>
<IconStyle><br>
<colorMode>normal</colorMode><br>
所以它看起来像这样:
<Style id="KMLStyler"><br>
<IconStyle><br>
<colorMode>normal</colorMode><br>
function foo() {
var leadingSpaces = arguments[0].length;
var str = '';
while(leadingSpaces > 0) {
str += ' ';
leadingSpaces--;
}
return str;
}
var s = " A B C";
print(s.replace(/^[ \t]+/mg, foo));
我尝试了一个基本的替换,但它匹配所有空格,而不仅仅是前导空格。我想留下所有的空间,除了前面的。有什么想法吗?JavaScript没有方便的\G甚至看起来都不落后,因此没有针对这种AFAIK的纯正则表达式解决方案。像这样的怎么样:
<Style id="KMLStyler"><br>
<IconStyle><br>
<colorMode>normal</colorMode><br>
function foo() {
var leadingSpaces = arguments[0].length;
var str = '';
while(leadingSpaces > 0) {
str += ' ';
leadingSpaces--;
}
return str;
}
var s = " A B C";
print(s.replace(/^[ \t]+/mg, foo));
产生:
A B C
此处测试:
编辑
或者用一个匿名的内部函数来做,它叫什么?正如glebm在评论中所评论的:
var s = " A B C";
print(s.replace(/^[ \t]+/gm, function(x){ return new Array(x.length + 1).join(' ') }));
请看这里的实际情况:JavaScript没有方便的\G甚至看不到落后,因此没有针对此AFAIK的纯正则表达式解决方案。像这样的怎么样:
<Style id="KMLStyler"><br>
<IconStyle><br>
<colorMode>normal</colorMode><br>
function foo() {
var leadingSpaces = arguments[0].length;
var str = '';
while(leadingSpaces > 0) {
str += ' ';
leadingSpaces--;
}
return str;
}
var s = " A B C";
print(s.replace(/^[ \t]+/mg, foo));
产生:
A B C
此处测试:
编辑
或者用一个匿名的内部函数来做,它叫什么?正如glebm在评论中所评论的:
var s = " A B C";
print(s.replace(/^[ \t]+/gm, function(x){ return new Array(x.length + 1).join(' ') }));
请参见此处的操作:使用“^”将模式锚定在字符串的开头,或者如果您处理的是多行字符串,则使用“^”:嵌入的换行符将\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引擎是否会注意到它是同一个函数并缓存它。