我已经看过关于这个主题的各种帖子,但是当我执行以下操作时,我得到了一个奇怪的结果:
var dirtyString = '<>I\really|\re\ad?"the/wh\ole*:da|\y?.'
var cleanString = dirtyString.replace(/[\/:*?"<>|.]/g, "");
console.log(cleanString);
删除所有非法字符,但&#34; r&#34;字母也被删除。在控制台日志中,我得到了&#34; Ieallyeadthewholeday&#34;似乎&#34; \&#34;之前&#34; r&#34;擦除&#34; r&#34;。 &#34; \&#34;没有删除之前的其他字母。我错过了什么吗?
答案 0 :(得分:3)
\r
是回车符。如果你想要一个反斜杠后跟r
,那么你需要转义反斜杠:\\r
。
\y
不是保留的转义序列,因此JavaScript会将其解释为\
,后跟y
。其他编程语言(如C#)将引发有关无法识别的转义序列的编译器错误。
进一步混淆的事情:大多数正则表达式语法都有自己的反斜杠转义序列,这些转义序列与托管语言不同,例如字符类\W
,\d
等。幸运的是它们的工作原因是{ {1}}和\W
不是在JavaScript中保留的,但是在这位作者看来,有意义的是逃避反斜杠然后只是为了让读者真正清楚,或者你想让你的正则表达式是便携式的语言之间。
答案 1 :(得分:1)
如果您尝试console.log(dirtyString)
,您也会看到您的“r”也“丢失”。
这是因为'\ r'实际上是回车符字符的转义序列(代码13)。你的replace()对它没有任何作用。它仍然只是没有显示。尝试使用String.charAt()
和String.charCodeAt()
进行游戏,您会看到角色仍在那里。
作为旁注,您试图删除“列入黑名单”的字符,并且黑名单几乎从不正确的方法。正如您在自己的案例中所看到的,您忘记将'\ r'字符(和许多其他字符)列入黑名单。白名单更安全。例如,您可以决定只接受拉丁字母和数字,然后删除未列入白名单的所有内容:var cleanString = dirtyString.replace(/[^a-z0-9]/gi, "");
。