为什么会这样
>> 'Tøjstørrelse'.replace(/[^A-Za-z0-9]*/g, '_');
导致
"_T__j_s_t__r_r_e_l_s_e_"
并不是
"Tjstrrelse"
正如我所料?
更新:这个问题是为了让我理解行为。我知道这'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '_');
会产生预期的结果。
为什么会这样
>> 'Tøjstørrelse'.replace(/[^A-Za-z0-9]*/g, '_');
导致
"_T__j_s_t__r_r_e_l_s_e_"
并不是
"Tjstrrelse"
正如我所料?
更新:这个问题是为了让我理解行为。我知道这'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '_');
会产生预期的结果。
因为[^A-Za-z0-9]*
在每个不匹配的字符之前匹配空字符串。替换为*
,+
它将起作用
*
相当于{0,}
表示匹配0个或多个先前的构造==> 0次出现意味着每次没有char匹配时都会匹配空字符串!
+
相当于{1,}
意味着它需要至少出现一次才能匹配。
'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '_');
这将导致
T_jst_rrelse
[^A-Za-z0-9]*
可以匹配零无字符,并且可以在任何地方找到。
您想使用 + [^A-Za-z0-9]*
,甚至更好\W+
。
\w
也匹配下划线,但我认为这对你有用。
你需要的是:
'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '');
事实上,这+
是可选的——如果你省略了它,它仍然可以工作。
编辑:因为已经编辑了你的问题,要求解释,这里是:
/[^A-Za-z0-9]
将匹配非字母数字的任何内容(指定^
not并且之后的范围是 OR'd 在一起,因此这意味着不是 {A 到 Z,a 到 z 或 0 到 9})。
如果包括+
后面,则表示“一次或多次发生”。因此,例如,如果一行中有三个非字母数字字符,如果您包含+
但一个接一个替换,则它们将被批量替换 - 对结果没有影响。
'Tøjstørrelse'.replace(/[^A-Za-z0-9]*/g, '');