我正在处理新闻聚合器,而我的本地新闻RSS Feed在内容发送方面存在一些问题。例如,只要有引号,就会删除句号和下一句的第一个字母之间的空格:like.This
。
我尝试使用str.replace('.', '. ')
,但问题是因为有时会有空格,所以在某些句子中最终会有两个空格。如何规范化空格数?
另一个问题是,这是一篇很长的文章,所以理想情况下它需要非常快(或者我只需要实现异步)。
答案 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;
这会查找并使用括号(使用括号)捕获句点(\S
)后的非空格(\.
)字符,因为.
字符在常规中是特殊的表达式,代表任何字符&#39;)。这将在整个提供的字符串中全局查找(g
),然后将该非空白字符替换为前缀为空格的捕获匹配($1
)。
如果您可能不得不处理这些字符串中的十进制数字,我会将上述内容修改为:
.replace(/\.([^\s\d])/g, '. $1')
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;
完全相同,但在句号后面搜索 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++;
}
}
}