Javascript regexp replace的意外结果

Javascript regexp replace的意外结果,javascript,regex,Javascript,Regex,为什么会这样 >> 'Tøjstørrelse'.replace(/[^A-Za-z0-9]*/g, '_'); 导致 "_T__j_s_t__r_r_e_l_s_e_" T_jst_rrelse 而不是 "Tjstrrelse" 如我所料 更新:这个问题是为了让我理解这种行为。我知道,'Tøjstørrelse'。替换(/[^A-Za-z0-9]+//g,'''.')给出所需的结果。因为[^A-Za-z0-9]*在每个不匹配的字符之前匹配空字符串。将*替换为+,它将正常工

为什么会这样

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

"_T__j_s_t__r_r_e_l_s_e_"
T_jst_rrelse
而不是

"Tjstrrelse"
如我所料


更新:这个问题是为了让我理解这种行为。我知道,
'Tøjstørrelse'。替换(/[^A-Za-z0-9]+//g,'''.')
给出所需的结果。

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

*
相当于
{0,}
意味着匹配0个或多个先前构造==>0次出现意味着它将在没有字符匹配时每次匹配空字符串

+
相当于
{1,}
意味着它至少需要一个匹配项

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

T_jst_rrelse

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

*
相当于
{0,}
意味着匹配0个或多个先前构造==>0次出现意味着它将在没有字符匹配时每次匹配空字符串

+
相当于
{1,}
意味着它至少需要一个匹配项

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

T_jst_rrelse

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

您想使用+
[^A-Za-z0-9]*
,或者更好的
\W+


\w
也可以匹配下划线,但我认为这对您很有用。

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

您想使用+
[^A-Za-z0-9]*
,或者更好的
\W+

\w
也匹配下划线,但我认为这对您很有用。

您需要的是:

'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '');
事实上,
+
是可选的-如果省略它,它仍然可以工作

编辑:由于编辑了您的问题并要求解释,因此如下所示:

/[^A-Za-z0-9]
将与任何非字母数字的内容匹配(
^
指定不匹配,并且后面的范围是或组合在一起,因此表示不匹配{A到Z,A到Z或0到9})

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

您需要的是:

'Tøjstørrelse'.replace(/[^A-Za-z0-9]+/g, '');
事实上,
+
是可选的-如果省略它,它仍然可以工作

编辑:由于编辑了您的问题并要求解释,因此如下所示:

/[^A-Za-z0-9]
将与任何非字母数字的内容匹配(
^
指定不匹配,并且后面的范围是或组合在一起,因此表示不匹配{A到Z,A到Z或0到9})


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

是的,我知道这一点。但这并没有回答我的问题。@tbsalling-你可能应该编辑这个问题,这会造成一些混乱。您可能希望将预期结果更改为
T\u jst\u rrelse
。那《密码》呢?是的,我知道。但这并没有回答我的问题。@tbsalling-你可能应该编辑这个问题,这会造成一些混乱。您可能希望将预期结果更改为
T\u jst\u rrelse
。那么Tøu j呢?这是正确的,但是用“无”代替“无”有什么害处呢?结果没有差别,但从语义上看,它似乎非常错误!这是正确的,但是用“无”替换“无”有什么害处呢?结果没有区别,但从语义上看,它似乎是非常错误的!关于你的更新:我的解释够了吗?还是还有一部分你不明白?不,我想我现在明白了。谢谢大家的支持!关于你的更新:我的解释够了吗?还是还有一部分你不明白?不,我想我现在明白了。谢谢大家的支持!