正则表达式将多个空格替换为单个空格

给定一个字符串,如:

"The dog      has a long   tail, and it     is RED!"

What kind of jQuery or JavaScript magic can be used to keep spaces to only one space max?

Goal:

"The dog has a long tail, and it is RED!"
643087 次浏览
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

编辑: 如果你想替换所有类型的空格字符,最有效的方法是这样的:

str = str.replace(/\s{2,}/g,' ');

如果你还想覆盖制表符、换行符等,只需将\s\s+替换为' '

string = string.replace(/\s\s+/g, ' ');

如果你真的想只覆盖空格(而不是制表符、换行符等),请这样做:

string = string.replace(/  +/g, ' ');

这是一个解决方案,尽管它将针对所有空格字符:

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')


"The dog has a long tail, and it is RED!"

编辑:这可能更好,因为它的目标是一个空格,后跟1个或多个空格:

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')


"The dog has a long tail, and it is RED!"

替代方法:

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

我没有单独使用/\s+/,因为它多次替换跨越1个字符的空格,并且可能效率较低,因为它的目标超过了必要的范围。

我没有深入测试任何这些,所以lmk如果有错误。

此外,如果您要进行字符串替换,请记住将变量/属性重新分配给它自己的替换,例如:

var string = 'foo'
string = string.replace('foo', '')

使用jQuery.prototype.text:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

或者如果您还想替换选项卡:

var replaced = string.replace(/\s+/g, " ");

还有一种可能性:

str.replace( /\s+/g, ' ' )
var myregexp = new RegExp(/ {2,}/g);


str = str.replace(myregexp,' ');

因为你似乎对性能感兴趣,我用Firebug分析了这些。这是我得到的结果:

str.replace( /  +/g, ' ' )       ->  380ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( / +/g, ' ' )        ->  790ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

这是在Firefox上,运行100k字符串替换。

如果您认为性能是一个问题,我鼓励您使用Firebug进行自己的分析测试。众所周知,人类不擅长预测他们程序中的瓶颈所在。

(另外,请注意IE 8的开发人员工具栏也内置了一个分析器——可能值得检查IE中的性能如何。)

更强大:

function trim(word)
{
word = word.replace(/[^\x21-\x7E]+/g, ' '); // change non-printing chars to spaces
return word.replace(/^\s+|\s+$/g, '');      // remove leading/trailing spaces
}

如果您不想使用替换,这里有一个替代解决方案(在不使用替换javascript的情况下替换字符串中的空格)

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;


str = str.split(rule).join(" ");


document.write(str);

我有这个方法,我称之为Derp方法,因为没有更好的名字。

while (str.indexOf("  ") !== -1) {
str = str.replace(/  /g, " ");
}

在JSPerf中运行它会产生一些令人惊讶的结果,它击败了一些更复杂的方法编辑原始JSPerf链接http://jsperf.com/removing-multiple-spaces/3当时似乎已经死了

我建议

string = string.replace(/ +/g," ");

对于空格

string = string.replace(/(\s)+/g,"$1");

将多个返回也转换为单个返回。

新手等的综合未加密答案。

这是为了所有像我这样的傻瓜,他们测试你们中一些人写的脚本,这些脚本不起作用。

以下3个例子是我在以下3个网站上删除特殊字符和额外空格的步骤(所有这些都很好地工作){1.EtaVisa.com2.EtaStatus.com3.Tikun.com}所以我知道这些工作很好。

我们一次将这些链接在一起超过50个,没有问题。

//这删除了特殊字符+0-9,只允许字母(大写和小写)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

//这删除了特殊字符,只允许字母(大写和小写)和0-9 AND空格

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

//这删除了特殊字符,只允许字母(大写和小写)和0-9 AND空格 //末尾的替换(/\s\s+/g, " ") 删除过多的空格 //当我使用单引号时,它不起作用。

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

::下一个:: 将#3另存为a .js//我调用了我的NoDoubles.js

::下一个:: 将您的JS包含在您的页面中

 <script language="JavaScript" src="js/NoDoubles.js"></script>

将其包含在表单字段中d:: 例如

<INPUT type="text" name="Name"
onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

所以它看起来像这样

<INPUT type="text" name="Name" onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

这将删除特殊字符,允许单个空格并删除额外的空格。

我们可以使用下面的正则表达式来解释,这是在Sed系统命令的帮助下进行的。类似的正则表达式可以用于其他语言和平台。

将文本添加到某个文件中说测试

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

我们可以使用以下正则表达式将所有空格替换为单个空格

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

希望这能达到目的

我知道我迟到了,但我发现了一个很好的解决办法。

这里是:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');

更健壮的方法:这负责删除初始空格和尾随空格(如果存在)。例如:

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "


str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");


// str -> "The dog has a long tail, and it is RED !"

您的示例没有这些空格,但它们也是一个非常常见的场景,并且公认的答案只是将它们修剪成单个空格,例如:“The… RED!”,这不是您通常需要的。

尝试用单个空格替换多个空格。

<script type="text/javascript">
var myStr = "The dog      has a long   tail, and it     is RED!";
alert(myStr);  // Output 'The dog      has a long   tail, and it     is RED!'


var newStr = myStr.replace(/  +/g, ' ');
alert(newStr);  // Output 'The dog has a long tail, and it is RED!'
</script>

阅读更多@用单个空间替换多个空间

var text = `xxx  df dfvdfv  df
dfv`.split(/[\s,\t,\r,\n]+/).filter(x=>x).join(' ');

结果:

"xxx df dfvdfv df dfv"

要获得更多控制,您可以使用替换回调来处理该值。

value = "tags:HUNT  tags:HUNT         tags:HUNT  tags:HUNT"
value.replace(new RegExp(`(?:\\s+)(?:tags)`, 'g'), $1 => ` ${$1.trim()}`)
//"tags:HUNT tags:HUNT tags:HUNT tags:HUNT"

此脚本删除单词和修剪之间的任何空白(多个空格、制表符、返回等):

// Trims & replaces any wihtespacing to single space between words
String.prototype.clearExtraSpace = function(){
var _trimLeft  = /^\s+/,
_trimRight = /\s+$/,
_multiple  = /\s+/g;


return this.replace(_trimLeft, '').replace(_trimRight, '').replace(_multiple, ' ');
};

'鼠标指针触摸'.替换(/^\s+|\s+$|(\s)+/g,"1美元")应该可以!

我知道我们必须使用regex,但在一次采访中,我被要求不使用REGEX。

@slight lytyler帮助我采用了以下方法。

const testStr = "I   LOVE    STACKOVERFLOW   LOL";


const removeSpaces = str  => {
const chars = str.split('');
const nextChars = chars.reduce(
(acc, c) => {
if (c === ' ') {
const lastChar = acc[acc.length - 1];
if (lastChar === ' ') {
return acc;
}
}
return [...acc, c];
},
[],
);
const nextStr = nextChars.join('');
return nextStr
};


console.log(removeSpaces(testStr));

我的名字是Edelcio Junior。如果你想防止2个或更多的空白,这里是一个很好的解决方案:

<label">Name</label>
<input type="text" name="YourInputName">


<script>
var field = document.querySelector('[name="YourInputName"]');


field.addEventListener('keyup', function (event) {
var userName = field.value;
userName = userName.replace(/\s{2,}/g, ' ');
field.value = userName;
});
</script>

  var field = document.querySelector('[name="YourInputName"]');


field.addEventListener('keyup', function (event) {
var userName = field.value;
userName = userName.replace(/\s{2,}/g, ' ');
field.value = userName;
});
        <!DOCTYPE html>
<html lang="en">
<head>
<title>Your-title</title>
<meta charset="utf-8">
</head>
<body>
<form>
<label>Name</label>
<input type="text" name="YourInputName">
</form>
</body>
</html>

let nameCorrection = function (str) {
let strPerfect = str.replace(/\s+/g, " ").trim();
let strSmall = strPerfect.toLowerCase();
let arrSmall = strSmall.split(" ");
let arrCapital = [];
for (let x of arrSmall.values()) {
arrCapital.push(x[0].toUpperCase() + x.slice(1));
}


let result = arrCapital.join(" ");
console.log(result);
};
nameCorrection("Pradeep kumar dHital");

def removeblanks(text): return re.sub(r'\s\s+'," ",text) 我正在处理一个有很多重复空格的大型文本数据。 上面的RE对我有效。所有重复的空格都被一个空格替换了。

使用noDepad++函数,下面的正则表达式对我来说很好,

查找: {1}\K\s+
替换:leave it empty

以下是我的解决方案,对我很有效:

var text = "    Tes ddas    dMd WAlkman 3Dsfd    "
.toLowerCase()
.replace(/\b\s+/g, " ")
.replace(/\b\w/g, s => s.toUpperCase())
.trimStart()
.trimEnd();
    

console.log(text);


// result: Tes Ddas Dmd Walkman 3dsfd

//用一个空白替换多个空白

String replacedDisplayName = displayName.replaceAll("\\s{2,}", " ");