正则表达式结果跳过多个空格

时间:2015-09-06 20:13:26

标签: javascript regex whitespace

以下是我的问题的最小示例:

http://jsfiddle.net/pm913emb/5/

id    | value
----------------  
1 | 1_426_7894(245)
2 | 4_463_9654(465)
3 | 3_954_3678(465)
4 | 9_356_5412(157)
5 | 5_986_3578(987)
6 | 2_125_4689(749)
7 | 8_286_7859(879)

正如你所看到的,这个字符串包含多个句子,有两个地方我添加了多个空格:一个位于句子的末尾,另一个位于句子的中间。有正则表达式,我在这个字符串上运行。

问题是:正如您在控制台中看到的那样,匹配的结果不包含这些多个空格。

这个问题可能是什么原因。可能的解决方案?

请帮助..:/

3 个答案:

答案 0 :(得分:2)

浏览器不显示连续的空格。如果您要使用实体,则会显示空格。例如,

< - 2个空格

将显示为

< - 一个空格

在浏览器中。

如果您使用实体作为空格

  

你会得到

(2个空格(注意这里是一个间距)。

这是一篇较长的文章。

Browser white space rendering

我认为这可以实现你想要的东西(可能不是最干净的,我不经常写JS)..

<script type="text/javascript">
var string = 'Question 6 of 7 '
+'Three, the patient suddenly develops shortness of breath and becomes hypotensive.    His heart rate is 100/min, with a normaI PR and    QRS intervaI.'
var sentencesMatch = string.match(/([\sa-zA-Z\d]){1}.+?[\.!\?]{1}([\s ]+|$)/g);
var output = '';
for(var x= 0; x < sentencesMatch.length; x++){
    output += sentencesMatch[x].replace(/ /g, '&#160;');
}
document.write(output);
</script>

答案 1 :(得分:1)

您的代码正在运行

当您尝试打印数组本身时,浏览器会修剪控制台中的额外空白区域。尝试打印单个数组元素并(根据您的浏览器),您会看到它们确实包含额外的空格。

&#13;
&#13;
//You'll need to have the console open to see the results here

var string = 'Question 6 of 7 '
+'Three, the patient suddenly develops shortness of breath and becomes hypotensive.    His heart rate is 100/min, with a normaI PR and    QRS intervaI.'

var sentencesMatch = string.match(/([\sa-zA-Z\d]){1}.+?[\.!\?]{1}([\s ]+|$)/g);
console.log(sentencesMatch);

for (var i in sentencesMatch){
    //Add quotes so we can see trailing whitespace
    console.log('"' + sentencesMatch[i] + '"'); 
}
&#13;
&#13;
&#13;

默认情况下,HTML

中会额外修剪空白区域

如果您想将该字符串实际放入元素中,那么您将遇到同样的问题。以下是解决方法:

使用CSS

可能是最简单的解决方案。使用white-space属性

设置元素的样式

&#13;
&#13;
var string = 'Question 6 of 7 '
+'Three, the patient suddenly develops shortness of breath and becomes hypotensive.    His heart rate is 100/min, with a normaI PR and    QRS intervaI.'

var sentencesMatch = string.match(/([\sa-zA-Z\d]){1}.+?[\.!\?]{1}([\s ]+|$)/g);
for (var i in sentencesMatch){
  var p = document.createElement("p");
  document.body.appendChild(p);
  p.innerHTML = '"' + sentencesMatch[i] + '"';
  p.className = "keep-spaces";  
}
&#13;
.keep-spaces{
  white-space: pre;
}
&#13;
&#13;
&#13;

或..使用非中断空格

替换空格

此解决方案用“非破坏空间”替换所有空白字符。这由HTML实体&nbsp;&#160;&xa0;表示。

&#13;
&#13;
var string = 'Question 6 of 7 '
    +'Three, the patient suddenly develops shortness of breath and becomes hypotensive.    His heart rate is 100/min, with a normaI PR and    QRS intervaI.'
var sentencesMatch = string.match(/([\sa-zA-Z\d]){1}.+?[\.!\?]{1}([\s ]+|$)/g);

for (var i in sentencesMatch){
  var p = document.createElement("p");
  document.body.appendChild(p);
  //Replace spaces with &nbsp; to preserve consecutive white space
  var str = sentencesMatch[i].replace(/\s/g,'&nbsp;');
  p.innerHTML = '"' + str + '"';
}
&#13;
&#13;
&#13;

答案 2 :(得分:-1)

这不是你的正则表达式中的问题,也不是你拥有的字符串,如果你试过放一个&#39; \ n&#39;。你看它基本上只用一个空格替换它,因此问题在于你的浏览器。你可能想要添加这样的标题来修复它:

content-type: text/html

或尝试使用base64编码,并在需要时进行编码。解码它。