let a = ' lots of spaces in this ! '
console.log(a.replace(/\s+(\W)/g, '$1'))
日志在其中显示很多空格!
上面的正则表达式完全符合我的要求,但是我试图理解为什么? 我了解以下内容:
捕获/ $ 1 删除了 This 和!
单词之间的空格我明白了,但我没明白是如何?所有其他空格都被删除了吗??我不相信我已要求他们这样做(尽管我很高兴他们如此)。
我得到一个console.log(a.replace(/\s+/g, ' '));
,因为替换是用单个空格''替换字母数字字符之间的1个或多个空格。
我正在摸索以了解第一个RegEx /\s+(\W)/g, '$1'
如何用一个空格替换一个或多个空格。
答案 0 :(得分:1)
让我们使用此字符串Tools -> Options -> Kits -> Kits
并运行它。
我们得到'aaa&bbb'
'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!☹'