0

为什么会这样

>> '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, '_');会产生预期的结果。

4

4 回答 4

4

因为[^A-Za-z0-9]*在每个不匹配的字符之前匹配空字符串。替换为*+它将起作用

*相当于{0,}表示匹配0个或多个先前的构造==> 0次出现意味着每次没有char匹配时都会匹配空字符串!

+相当于{1,}意味着它需要至少出现一次才能匹配。

'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '_');

这将导致

T_jst_rrelse
于 2013-09-24T11:11:15.403 回答
1

[^A-Za-z0-9]*可以匹配零无字符,并且可以在任何地方找到。

您想使用 + [^A-Za-z0-9]*,甚至更好\W+
\w也匹配下划线,但我认为这对你有用。

于 2013-09-24T11:11:55.903 回答
1

你需要的是:

'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '');

事实上,这+是可选的——如果你省略了它,它仍然可以工作。

编辑:因为已经编辑了你的问题,要求解释,这里是:

/[^A-Za-z0-9]将匹配非字母数字的任何内容指定^not并且之后的范围是 OR'd 在一起,因此这意味着不是 {A 到 Z,a 到 z 或 0 到 9})。

如果包括+后面,则表示“一次或多次发生”。因此,例如,如果一行中有三个非字母数字字符,如果您包含+但一个接一个替换,则它们将被批量替换 - 对结果没有影响。

于 2013-09-24T11:15:14.793 回答
0
'Tøjstørrelse'.replace(/[^A-Za-z0-9]*/g, ''); 
于 2013-09-24T11:11:43.350 回答