首页 > 解决方案 > JS regex 正面看后面 * 什么时候不贪心呢?

问题描述

如果我查看文档,它说*应该总是贪婪,但在这种情况下它不是:

// returns 'password*****' instead of 'password: *****'
'password: "something"'.replace(/(?<=password[ :]*)[^\n,]+/i, '*****') 

标签: javascriptregexecmascript-6lookbehind

解决方案


来自 TC39 文档lookbehind proposal

模式通常从最左边的子模式开始匹配,如果左边的子模式成功,则移动到右边的子模式。当包含在后向断言中时,匹配的顺序将被颠倒。模式将从最右边的子模式开始匹配,然后向左前进。例如,给定/(?<=\$\d+\.)\d+/,模式将首先找到一个数字并首先确保它前面是 。往回走,然后是 \d+ 从 . 开始,最后是 $ 从断言中的 \d+ 开始的地方开始。回溯方向也将因此而反转。


由于您[^\n,]+将匹配所有字符new line and ,,因此它也会捕获:并且您的后视将看不到它,因为它已经被后视后的断言捕获,

你可以做的是使用+这将确保你至少匹配one space or :

'password: "something"'.replace(/(?<=password[ :]+)[^\n,]+/i, '*****') 


推荐阅读