【问题标题】:How to remove a space before a dot?如何删除点前的空格?
【发布时间】:2021-04-13 21:35:30
【问题描述】:

我尝试在句子中间加一个点,在大写字母之前。 我试过这个:

function correctSentences(str){
  s = str.replace(/([A-Z])/g,'. $1').trim();
 return s;
}
correctSentences("  avi loves pizza Dani loves cola  "); 

输出是:

"avi loves pizza . Dani loves cola"

如何删除点之前的空格? 谢谢!

【问题讨论】:

  • 当你的句子中有大写字母不是句首时你会怎么做?比如“大卫什么时候来”、“我在这里”……还有很多其他的案例?
  • 好问题...这只是一个练习..
  • 如果这只是一个练习,那么您可以根据这个特定要求对下面的答案进行评分/评分,而不是您现在看到的其他极端情况。如果您需要更通用的解决方案,那么您可能需要编写某种解析器,或者使用已经存在的库;但单独使用正则表达式可能不是正确的方向。

标签: javascript space uppercase


【解决方案1】:

在正则表达式中添加\s

function correctSentences(str){
  s = str.replace(/(\s[A-Z])/g,'.$1').trim();
 return s;
}

console.log(correctSentences("  avi loves pizza Dani loves cola  "));

【讨论】:

    【解决方案2】:

    我会使用这个版本:

    function correctSentences(str) {
        return str.replace(/\s+(?=[A-Z])/g, '.  ').trim();
    }
    
    var input = "  avi loves pizza Dani loves cola  ";
    var output = correctSentences(input);
    console.log(input + "\n" + output);

    这里的正则表达式逻辑是:

    \s+        match one or more whitespace characters
    (?=[A-Z])  then assert (but do not consume) that what follows is a capital letter
    

    我们用点代替,结束上一句,后跟两个空格,隔开下一句的开头。

    【讨论】:

    • 谢谢。我在“Dani”之前添加了一个点,输出包括两个点...
    • 不确定这条评论应该说什么。需要详细说明吗?
    • 我的意思是这个解决方案不会阻止添加额外的 .如果已经有一个 .存在。
    • @yosii84 你有很多我的回答(以及这里给出的其他答案)无法涵盖的边缘情况。正则表达式不是纠正文本中的语法和标点符号的灵丹妙药。
    【解决方案3】:

    我建议:

    function correctSentences(str){
      return str.replace(/(?=\b\s+[A-Z])/g, '.').trim();
    }
    const result = correctSentences("  avi loves pizza. Bob loves pizza Dani loves cola  "); 
    
    console.log(result);

    如果已经存在.,它还会阻止添加额外的.

    【讨论】: