regexp替换的意外结果

时间:2013-09-24 11:09:01

标签: javascript regex

为什么会这样

>> '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 个答案:

答案 0 :(得分:4)

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

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

+相当于{1,}表示至少需要匹配一次。

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

这将导致

T_jst_rrelse

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您需要的是:

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

事实上,+是可选的 - 如果你省略它,它仍然有用。

编辑:由于编辑了您的问题并要求解释,因此这里是:

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

如果您包含+之后,则表示“一次或多次出现”。因此,例如,如果一行中有三个非字母数字字符,那么如果您包含+但是在没有的情况下一个一个地替换它们,它们将被批量替换。对结果没有任何影响。

答案 3 :(得分:0)

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