Javascript正则expression式“replace(/ / g)”删除数字?

我正在使用replace JavaScript函数在Javascript中进行一些testing。

考虑在节点REPL上执行的以下示例。
这是一个replace ,从string中删除空格,连字符和下划线。

 > "call this 9344 5 66 22".replace(/[ _-]/g, ''); 'callthis934456622' 

那正是我期待的。 只删除空格。

不过看看这个:

 > "call this 9344 5 66 22".replace(/[ -_]/g, ''); 'callthis' 

为什么当我把这个正则expression式组合像这样-_ (空格,连字符,下划线)是否删除string中的数字?


我做了更多的testing:

- (空格,连字符)不会删除数字

_ (空格,下划线)不会删除数字

_- (空格,下划线,连字符)不会删除数字

-_ (连字符,下划线,空格)不会删除数字

_- (下划线,连字符,空格)REPL块

-_ (空格,连字符,下划线)删除数字

[ -_]表示从space (ASCII 32)到_ (ASCII 95)的字符,其中包括数字和大写字母。

你正在寻找的是[ \-_] 。 逃避-将使其行为像字符,而不是范围的元字符。

如果字符类中的开始或结束位置不存在,则连字符需要被转义,否则表示一个range

所以这个正则expression式:

 [ -_] 

将匹配任何从空格到下划线,即ASCII 32-95

字符在字符类中有特殊的含义。 当出现在两个字符之间时,它表示一个字符范围 – 例如[az]匹配任何字符代码在az之间a字符。

然而,正如你所看到的,当它被放置在字符类的开始或结束时,它只是表示一个字面值。 这也可以通过在字符类中[ \-_] – 即[ \-_]

 "call this 9344 5 66 22".replace(/(\s|-|_)/g, ''); 

在一个类中,短划线字符在作为范围运算符时才有特殊含义
分离从左到右分解的子句。

否则,它被认为没有任何其他文字不同。

正则expression式parsing器没有时间担心好的表单

所以你可以把短划线放在任何你想要的字面上,只要它把条款分开(即不含糊)。

大多数人把它放在最后或开始或逃脱,所以没有发生概念错误。

条款的例子,这是高光,文字破折号:

[ – az\p{L}0-9\x00-\x09 – \ x20-]