我在Javascript中使用replace javascript函数进行了一些测试。
考虑在node REPL上执行的以下示例
它是replace
,用于删除字符串中的空格,连字符和下划线。
> "call this 9344 5 66 22".replace(/[ _-]/g, '');
'callthis934456622'
这就是我所期待的。仅删除空格。
但请看一下:
> "call this 9344 5 66 22".replace(/[ -_]/g, '');
'callthis'
为什么当我把这个正则表达式组合完全像这个-_
(空格,连字符,下划线)时,它会删除字符串中的数字?
我做了更多测试:
-
(空格,连字符)不会删除数字
_
(空格,下划线)不会删除数字
_-
(空格,下划线,连字符)不会删除数字
-_
(连字符,下划线,空格)不会删除数字
_-
(下划线,连字符,空格)REPL块??
-_
(空格,连字符,下划线)确实会删除数字
答案 0 :(得分:14)
[ -_]
表示从space
(ASCII 32)到_
(ASCII 95)的字符,其中包括数字和大写字母。
您要找的是[ \-_]
。转义-
会使其像字符一样,而不是范围的元字符。
答案 1 :(得分:3)
如果在字符类的开头或结尾位置不存在连字符,则需要进行转义,否则它代表range
。
所以这个正则表达式:
[ -_]
将匹配从空格到下划线的任何内容,即ASCII 32-95
答案 2 :(得分:3)
-
字符在字符类中具有特殊含义。当它出现在两个字符之间时,表示字符范围 - 例如[a-z]
匹配任何字符代码在a
和z
之间的字符。
但是,正如您所观察到的,当它放在字符类的开头或结尾时,它只代表一个文字-
字符。这也可以通过转义字符类中的-
来完成,即[ \-_]
。
答案 3 :(得分:2)
"call this 9344 5 66 22".replace(/(\s|-|_)/g, '');
答案 4 :(得分:1)
在一个班级中,破折号字符作为范围操作符具有特殊含义 它 没有 单独的子句,从左到右解析。
否则,它被认为与任何其他文字没有什么不同。
正则表达式解析器没有时间担心好 表单 。
所以你可以将短划线作为文字放在任何地方,只要它将条款分开(即它不是暧昧的)。
大多数人把它放在最后或开始或逃避它,所以不会发生概念错误。
高亮的子句和文字短划线的示例:
[ - a-z
- \p{L}
- 0-9
- \x00-\x09
- \ X20 - ]