Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于删除空白的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 用于删除空白的正则表达式

Javascript 用于删除空白的正则表达式,javascript,regex,Javascript,Regex,我有一些文字看起来像这样- " tushar is a good boy " "tushar is a good boy" 我想使用javascript删除字符串中所有多余的空格 结果字符串不应该有多个空格,而应该只有一个空格。此外,起点和终点不应该有任何空白。所以我的最终输出应该是这样的- " tushar is a good boy " "tushar is a good boy" 我目前正在使用以下代码- str.replace(/(

我有一些文字看起来像这样-

"    tushar is a good      boy     "
"tushar is a good boy"
我想使用javascript删除字符串中所有多余的空格

结果字符串不应该有多个空格,而应该只有一个空格。此外,起点和终点不应该有任何空白。所以我的最终输出应该是这样的-

"    tushar is a good      boy     "
"tushar is a good boy"
我目前正在使用以下代码-

str.replace(/(\s\s\s*)/g, ' ')
这显然是失败的,因为它没有考虑字符串开头和结尾的空格。

尝试以下方法:

str.replace(/\s+/g, ' ').trim()
如果您没有
修剪
添加此项

试试:

str.replace(/^\s+|\s+$/, '')
   .replace(/\s+/, ' ');

这可以在单个
字符串#replace
调用中完成:

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

// gives: "tushar is a good boy"
试一试


第一个替换是删除字符串的前导空格和尾随空格。

因为每个人都在抱怨
.trim()
,所以可以使用以下方法:

str.replace(/\s+/g')。replace(/^\s/,'')。replace(/\s$/,'')

这很有效:

function normalizeWS(s) {
    s = s.match(/\S+/g);
    return s ? s.join(' ') : '';
}
  • 修剪前导空格
  • 修剪尾随空格
  • 将制表符、换行符和多个空间规格化为单个常规空间

能否使用string.trim()作为解决方案?组合两行代码。@gbam
trim()
只会修剪字符串的开头和结尾。这不能解释“好孩子”的原因@sircapsalot,对吧。您可以将这两种解决方案结合起来。使用正则表达式修剪中间的,使用trim修剪外部的。我将编辑我的评论以澄清。你有需要保留的新行吗?还是只有空白标签/空格?@JosephMyers:我忘了提这个,我还想删除新行和制表符。这不符合OP的要求。OP还希望修剪开头和结尾的空格。除非使用JS 1.8,否则字符串没有
trim
方法。1@Jacob是的,有:你确定OP也想删除换行符吗?另外,最好使用
{2,}
作为量词;毕竟,用空格替换单个空格没有多大意义。我不想让你看到多个reg ex语句。这看起来并不优雅:)多个reg ex语句通常更有效。我也看到过这样的问题,巨大、缓慢的单一正则表达式可以组合成几个简单的正则表达式,但前提是程序员愿意避免“优雅”而使用多个语句。优雅是主观的。这真是太棒了!
(?=\s)
的作用是什么?(?=\s)确保至少有一个空格未包含在匹配中。这样,只会删除额外的空间,而不会删除最终的空间。但是,问题是不管最后的空格字符是什么(制表符、换行符等),它都会保留下来,不会被实际的空格替换。@MathewFoscarini:正如Joseph所评论的,它实际上是一个积极的前瞻,确保
\s+
后面总是跟一个空格。在这里阅读更多信息:www.regular-expressions.info/lookaround。html@anubhava我没有说最后的空格会保留。我的意思是,如果必要的话,分隔单词的空格将不会变为实际的空格。例如,“hello[space][space][tab]world”将更改为“hello[tab]world”+1不确定为什么有人对这个答案投了反对票。在我看来,这是最普遍兼容和最有效的单语句答案。(另请参阅:关于使用JavaScript修剪字符串的最佳方法的精彩讨论)是否可以保留换行符?理想情况下,它将保持单换行符的原样(并删除其周围的其他空格),并将多个换行符和中间的其他可选空格折叠为两个换行符。@CoDEmanX是的,这也是可能的。执行您要求的操作的有效方法是将整个字符串拆分为行的内容(使用
\n+
(?:\r\n)+
作为行分隔符),然后对每行应用
normalizeWS
,然后使用单个
\n
重新连接行。(如果愿意,也可以使用
\r\n
)这是一个好主意,但它需要对规范化行进行额外的筛选,以丢弃后续的空字符串,从而将2+个换行符折叠为两个。我找到了一种可能不是最有效的方法,但它可以按预期工作:
str.match(/[^\t]+/g).join('''.join.).replace(/(?:\n[\t]*){2,}/,'\n\n')