如何用正则表达式选择除特定字符之前的最后两个以外的所有多个空格?

时间:2019-05-16 13:17:15

标签: javascript regex

这是一个示例字符串:

   Lorem ipsum   
         - dolor sit amet consectetur      
    - adipisicing elit. Adipisci, quam.     

最优雅的正则表达式是选择所有多余的空格(“-”之前的两个空格除外)以制成优雅的列表吗?

以下是示例结果:

Lorem ipsum
  - dolor sit amet consectetur
  - adipisicing elit. Adipisci, quam.

这是我最好的猜测:/ {2,}(?! {2}-)/g. 可悲的是,它还会选择“-”之前的两个空格。

编辑: 我想我会跟着去:

let str = `       Lorem ipsum   
             - dolor sit amet consectetur      
        - adipisicing elit. Adipisci, quam.   `;
str = str.replace(/ {2,}/g, "");
str = str.replace(/-/g, "  -");
console.log(str);

3 个答案:

答案 0 :(得分:1)

您可以从字符串的开头和结尾选择所有空格或制表符,然后将其替换为空字符串。然后以2个空格替换以连字符开头的字符串。

const regex = /^[\t ]+|[\t ]+$/mg;
const str = `   Lorem ipsum
         - dolor sit amet consectetur
    - adipisicing elit. Adipisci, quam. `;
const subst = ``;
const result = str.replace(regex, subst).replace(/^-/gm, "  -");
console.log(result);

您还可以结合使用贴图和修剪:

let str = `   Lorem ipsum
         - dolor sit amet consectetur
    - adipisicing elit. Adipisci, quam. `;
str = str.split("\n").map(s => s.trim()).map(x => x.replace(/^-/, "  -")).join("\n");
console.log(str);

答案 1 :(得分:1)

(^( +)[a-zA-Z])|(( +)(( {2}-)|\n|$))
  • (^( +)[a-zA-Z]):该组匹配Lorem Ipsum前的字符。
  • (( +)(( {2}-)|\n|$))该组匹配两个空格和-之前,换行符\n之前或字符串$末尾之前的字符。

https://regex101.com/r/i4ppG7/5

答案 2 :(得分:0)

您可以使用捕获组

let str = `Lorem ipsum   
        - dolor sit amet consectetur      
  - adipisicing elit. Adipisci, quam.  `

let finalList = str.replace(/^\s*(\s{2}.*)$/gm, '$1')

console.log('original list\n',str)
console.log('New list\n',finalList)