【问题标题】:Single regex to remove empty lines and double spaces from multiline input单个正则表达式从多行输入中删除空行和双空格
【发布时间】:2020-05-14 08:31:48
【问题描述】:

我想结合两个正则表达式函数来清理一些文本区域输入。我想知道这是否可能,或者我是否应该将它保留两个单独的(工作正常但看起来不漂亮或干净)。

我已经进行了调整,以便它们使用全局和多行 (/gm) 并被替换为空 ('')。我尝试在任何位置使用括号和垂直/或线条,但它永远不会给出预期的结果,所以我只能假设有一种我忽略的方法或者我应该保持原样。

正则表达式 1:/^\s+[\r\n]/gm

正则表达式 2:/^\s+| +(?= )|\s+$/gm

目前在 JavaScript 中:string.replace(/^\s+[\r\n]/gm,'').replace(/^\s+| +(?= )|\s+$/gm,'')

目标是删除:

  • 每行开头和结尾的空格
  • 空行(包括开头和结尾的任何行)
  • 双空格

没有它在同一行结束。单行换行符 (\r\n) 最后应该仍然存在。

正则表达式 1 是删除任何空行 (^\s+[\r\n]),正则表达式 2 在开头 (^\s+) 和结尾 (\s+$) 中修剪空格,并删除双精度(以及三重、四重等) ) 之间的空格 (+(?= ))。

输入:


   Let's  
make   this
 look

 a    little


    nicer   
  and 
more   

readible


输出:

Let's
make this
look
a little
nicer
and
more
readible

编辑:非常感谢 Wiktor Stribiżew and his comment 提供完整的解决方案:

/^\s*$[\r\n]*|^[^\S\r\n]+|[^\S\r\n]+$|([^\S\r\n]){2,}|\s+$(?![^])/gm

【问题讨论】:

  • 试试s.replace(/^\s*$[\r\n]*|^[^\S\r\n]+|[^\S\r\n]+$|([^\S\r\n]){2,}/gm, '$1')。要同时删除尾随换行符,请将|\s+$(?![^]) 添加到模式的末尾。
  • /^\s*\n|^\s+/gm 开头删除行首和行尾的空行和空格。它不包括单词之间的双空格。
  • @BojanBedrač 它确实完成了大部分工作,尤其是在为双空格添加 +(?= ) 和为尾随换行符添加 Wiktor 的 |\s+$(?![^]) 时。不幸的是,行尾的空格仍然存在。
  • @BojanBedrač 然而,这个黑客可以工作:/^\s*[\r\n]|^\s+| +(?= )| +$|\s+$(?![^])/gm

标签: javascript regex


【解决方案1】:

我建议使用替换模板"$1$2" (demo) 使用以下表达式:

/^\s*|\s*$|\s*(\r?\n)\s*|(\s)\s+/g

说明:

  • ^\s* - 匹配文本开头的空格
  • \s*$ - 匹配文本结尾的空格
  • \s*(\r?\n)\s* - 匹配位于不同行的两个单词之间的空格,捕获一个 CRLF 到组 $1
  • (\s)\s+ - 捕获 2+ 个空白字符序列中的第一个空白字符以分组 $2

【讨论】:

  • 哇,好干净!非常感谢!
猜你喜欢
  • 2021-04-10
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 2020-10-27
相关资源
最近更新 更多