完全停止后检查空间

时间:2015-02-07 17:55:11

标签: javascript

我正在处理新闻聚合器,而我的本地新闻RSS Feed在内容发送方面存在一些问题。例如,只要有引号,就会删除句号和下一句的第一个字母之间的空格:like.This

我尝试使用str.replace('.', '. '),但问题是因为有时会有空格,所以在某些句子中最终会有两个空格。如何规范化空格数?

另一个问题是,这是一篇很长的文章,所以理想情况下它需要非常快(或者我只需要实现异步)。

4 个答案:

答案 0 :(得分:3)

我自己的建议是:

.replace(/\.(\S)/g, '. $1')



var input = document.querySelector('p.input'),
  output = document.querySelector('p.output');

output.textContent = input.textContent.replace(/\.(\S)/g, '. $1');

<p class="input">Donec malesuada rhoncus massa, eu imperdiet tellus rhoncus ac.Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
<p class="output"></p>
&#13;
&#13;
&#13;

这会查找并使用括号(使用括号)捕获句点(\S)后的非空格(\.)字符,因为.字符在常规中是特殊的表达式,代表任何字符&#39;)。这将在整个提供的字符串中全局查找(g),然后将该非空白字符替换为前缀为空格的捕获匹配($1)。

如果您可能不得不处理这些字符串中的十进制数字,我会将上述内容修改为:

.replace(/\.([^\s\d])/g, '. $1')

&#13;
&#13;
var input = document.querySelector('p.input'),
  output = document.querySelector('p.output');

output.textContent = input.textContent.replace(/\.([^\s\d])/g, '. $1');
&#13;
<p class="input">Donec malesuada rhoncus massa, eu imperdiet tellus rhoncus ac.Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
<p class="output"></p>
&#13;
&#13;
&#13;

完全相同,但在句号后面搜索 not 空格或数字([^\s\d])。

参考文献:

答案 1 :(得分:2)

查找句点(\.),后跟0或更多空格([ ]*):

str = str.replace( /\.(?=[^\d])[ ]*/g , '. ')
  • 在正则表达式中,必须使用反斜杠(\)转义句点,否则,它是任何字符的模式
  • (?=[^\d])向前看而不匹配空格后面的字符,在这种情况下,我们要确保下一个字符不是数字,以避免在数字的中间放置一个空格(例如, 3.4或只是.5)
  • [ ]查找方括号内的任何字符,在本例中为空格。我把它放在方括号中,因为您可能会发现某些设备可能使用不同的编码,导致不同的空格字符匹配。它们在屏幕上看起来可能相同,但具有不同的匹配值;例如,unicode字符。发生这种情况时,您必须使用复制/粘贴将新奇怪的空格字符添加到此括号中
  • 星号(*)用于表示0或更多匹配条件,加号(+)用于表示1或更多(必须至少存在一次) )。如果您在一段时间后有2或3个空格,这一点非常重要。我们使用星号而不是加号来解决句子后面没有空格的情况(例如“Sentence.Next sentence。”)
  • 最后的g表示全局匹配,或搜索整个字符串并将其应用于所有匹配项,否则会在您的第一个句点停止
  • 最后'. '是我们要替换的,在这种情况下是一个句号(或句号)后跟一个空格

关于您的要求, fast 是一个相对术语。它曾经在一天之内完成任务很快,然后是几个小时很快等等。这完全取决于你认为快速的内容。在这种情况下,材料,存储器和处理能力的大小将影响处理时间;但我会说,总的来说,它很快。

var demo = document.getElementById('demo'),
    out = document.getElementById('out');

out.textContent = demo.textContent.replace(/\.(?=[^\d])[ ]*/g, '. ');
<div><pre id="demo" style="white-space:pre-wrap">This is a sentence followed by multiple spaces.   Followed by no spaces.That contains the number 1.0, which we don't want to separate.With no space before it.</pre></div>
<div><pre id="out" style="white-space:pre-wrap"></pre></div>

答案 2 :(得分:0)

使用正则表达式:

str = str.replace(/\. ?/g, '. ');

使用后面的问号将(转义)期间后的空格设为可选。

要进行快速测试,请打开此jsfiddle,打开浏览器控制台,然后运行:

http://jsfiddle.net/BloodyKnuckles/7wdv9csL/

如果空格数可以为任意数字,则使用:

str = str.replace(/\. */g, '. ');

在这种情况下,星号(*)表示可以有零个或多个空格。

答案 3 :(得分:0)

尝试使用此代码循环遍历字符串中的每个字符:

for (var i = 0, len = str.length; i < len; i++) {
  if (str[i] == '.') {
    if (str[++i] != ' ') {
      str = [str.slice(0, i), str.slice(i)].join(' ');
      i++;
      len++;
    }
  }
}