(/ \ s +(\ W)/ g,'$ 1')-如何删除空格?

时间:2019-02-26 21:22:12

标签: javascript regex

let a = ' lots of spaces in this ! ' console.log(a.replace(/\s+(\W)/g, '$1'))

日志在其中显示很多空格!

上面的正则表达式完全符合我的要求,但是我试图理解为什么? 我了解以下内容:

  • s + 正在寻找1个或更多空格
  • (\ W)正在捕获非字母数字字符
  • / g -全局,全部搜索/替换
  • $ 1 返回前一个字母数字字符

捕获/ $ 1 删除了 This

单词之间的空格

我明白了,但我没明白是如何?所有其他空格都被删除了吗??我不相信我已要求他们这样做(尽管我很高兴他们如此)。

我得到一个console.log(a.replace(/\s+/g, ' '));,因为替换是用单个空格''替换字母数字字符之间的1个或多个空格。

我正在摸索以了解第一个RegEx /\s+(\W)/g, '$1'如何用一个空格替换一个或多个空格。

3 个答案:

答案 0 :(得分:1)

让我们使用此字符串Tools -> Options -> Kits -> Kits并运行它。

我们得到'aaa&bbb'

  • \ s +会在与号前抢占3个空格
  • (\ W)抓住与号
  • $ 1是“&”号,并用'aaa &bbb'代替' &'

该原理适用于空格。您正在强迫其中一个空格满足'&'捕获组的替换要求。这也是为什么您的惊叹号没有被破坏的原因。

答案 1 :(得分:1)

您的正则表达式说的是“匹配一个或多个空格,后跟一个或多个非字母数字字符,然后用一个或多个非字母数字字符替换整个结果”。关键是\s+是贪婪的,这意味着它将尝试并匹配尽可能多的字符。因此,在任何给定的空格字符串中,它将尝试并匹配所有可以匹配的空格。但是,您的正则表达式还需要一个或多个非单词字符(\W+)。因为在您的情况下,每个最后一个空格之后的下一个字符是单词字符(即字母),因此正则表达式的最后一部分必须与最后一个空格匹配。

因此,给定字符串a b,并使用括号来标记\s+\W+匹配项,a( )( )b是正则表达式有效的唯一方法({ {1}}匹配前两个空格,\s+匹配最后一个空格。现在,这只是一个简单的替代。由于您将\W+用括号括起来,使其成为第一个也是唯一的捕获组,因此,用\W+替换匹配项将以该最后一个空格替换它。

作为另一个示例,对$1运行此替换将导致匹配看起来像a !b(因为a( )(!)b现在是最后一个非单词字符),因此最终替换结果将为!

答案 2 :(得分:0)

匹配列表如下。我用代替了空格,所以更容易看到

  "☹☹☹☹(☹)",
  "☹☹☹☹(☹)",
  "☹☹(!)",
  "☹(☹)"

代码说要用捕获组中的匹配替换匹配。

' lots of☹☹☹☹(☹)spaces☹☹☹☹(☹)in this☹☹(!)☹(☹)'

所以当您更换它时,您会得到

' lots of☹spaces☹in this!☹'