【问题标题】:How to remove whitespace chunks ending with a newline from string?如何从字符串中删除以换行符结尾的空白块?
【发布时间】:2020-05-23 07:36:11
【问题描述】:

我无法从字符串中删除所有空格。

Stehn        
Stehn        
Simchart
Simchart
Stehn        
Stehn        
Stehn        
Stehn        
Stehn  

这是字符串,包含新行、空格等。

string.replace(/[\r\n]+/gm, ', ')

这样做,只会回报我

Stehn , Stehn , Simchart, Simchart, Stehn , Stehn , Orion Reederei GmbH & Co KG, Orion Reederei GmbH & Co KG, Stehn , Stehn , Stehn , Arrow Shipping Germany, "

但我想用逗号得到一个规范化和净化的字符串。

string.replace(/\r?\n|\r/g, ',').split(',').map(s => s.trim()).join(', ')

然而,这段代码解决了我的问题,但我不喜欢这个解决方案,因为我的表中有数千个。

【问题讨论】:

  • \s 匹配任何空白字符 - 这是您需要的吗?
  • 它的 \s ,但它对我没有帮助
  • \s 匹配 \r、\n 和 \s,即空格。因此,如果您的目标是这样,我希望您给出一个文字空格
  • 为什么\s 没有帮助?您希望替换 all 空格,因此这似乎是合乎逻辑的选择。如果它不起作用,那么问题中不存在某些内容。
  • 是的,我知道,我们可以替换它,但我尝试了不同的方法。还有一个问题是我有一个像Orion Reederei GmbH & Co KG 这样的词,它有空格但不能替换。

标签: javascript regex


【解决方案1】:

我们可以尝试用一个逗号和空格替换所有空格以及紧随其后的 CR?LF。

var input = "Stehn        \nStehn        \nSimchart\nSimchart\nStehn       \nStehn        \nStehn        \nStehn        \nStehn ";
var output = input.replace(/\s*?\r?\n/g, ", ");
console.log(output);

【讨论】:

  • @NorayrGhukasyan 如果可行,请使用更高效的/[^\S\n]*\n/g
【解决方案2】:

您可以使用单个模式,并在替换中使用逗号和单个空格。

[^\S\r\n]*[\r\n]+
  • [^\S\r\n]* Negated character class,匹配 0+ 次空格字符,换行符除外
  • [\r\n]+ 匹配 1+ 个换行符(对于单个换行符,使用 \r?\n

Regex demo

    const regex = /[^\S\r\n]*[\r\n]+/g;
    const str = `Stehn        
Stehn        
Simchart
Simchart
Stehn        
Stehn        
Stehn        
Stehn        
Stehn  `;
    const result = str.replace(regex, `, `);
    console.log(result);

【讨论】:

  • 在这种情况下有什么更好的,我很困惑。 @TimBiegeleisen 解决方案也很好而且很短。为什么一个会更好?
  • @NorayrGhukasyan 两种解决方案都有效。不同之处在于 \s 也可以匹配 \r\n 使其变得惰性将涉及回溯以将 \s 的匹配扩展一项,直到匹配换行符。使用 [^\S\r\n] 会排除匹配的换行符。
【解决方案3】:

如果你的字符串是:

let s = "a     b     c         d    e   \nf    g  h\n\ni";

然后你可以剥离:

s.split(/\s+/)

并结合:

s.split(/\s+/).join(',');

如果它是换行符并且你想修剪,那为什么不直接拆分呢?比替换、拆分、修剪和重新加入更容易:

s.split(/\r?\n|\r/).map(s => s.trim()).join(', ')

【讨论】:

  • 似乎s.split(/\r?\n|\r/).map(s => s.trim()).join(', ') 是这种情况的唯一解决方案。如果没有更好的解决方案,我会将其标记为已接受。
  • 有一个更好的解决方案,不需要使用join
【解决方案4】:

由于您想用, 替换whitespace,您必须编写一个匹配空格的正则表达式

正则表达式: /\b\s+\b/gm

g:全局模式

m:多行模式

现在你的正则表达式应该匹配所有的空格。现在您所要做的就是将它们替换为,

请注意,我在这里使用单词边界,因为您不希望 , 在最后一个字符串的末尾。

【讨论】:

    【解决方案5】:

    试试这个。

    function removeAllBlankSpaces(str) {
       return str.split('').filter(s => s != ' ').join('');
    }
    
    console.log(removeAllBlankSpaces('str ing');
    

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 2013-01-12
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      相关资源
      最近更新 更多