Javascript RegExp的解释与字符串和数据属性不同

Javascript RegExp的解释与字符串和数据属性不同,javascript,regex,Javascript,Regex,长话短说,我正试图“修复”我的系统,因此我在后端使用与前端相同的正则表达式(出于明显的安全原因,验证了双方)。我已经让我的regex服务器端正常工作了,但是让它进入客户端是一件痛苦的事情。我最快的想法是简单地将它存储在标记的数据属性中,获取它,然后根据它进行验证 好吧,我,再想想!JS让我陷入了一个循环,因为显然RegExp对字符串的解释是不同的,这取决于它被拉入的方式。有没有人能告诉我这里发生了什么,或者我将如何着手解决这个问题 HTML 请注意,在前两个示例中,如果我动态地从data属性中提

长话短说,我正试图“修复”我的系统,因此我在后端使用与前端相同的正则表达式(出于明显的安全原因,验证了双方)。我已经让我的regex服务器端正常工作了,但是让它进入客户端是一件痛苦的事情。我最快的想法是简单地将它存储在标记的数据属性中,获取它,然后根据它进行验证

好吧,我,再想想!JS让我陷入了一个循环,因为显然RegExp对字符串的解释是不同的,这取决于它被拉入的方式。有没有人能告诉我这里发生了什么,或者我将如何着手解决这个问题

HTML

请注意,在前两个示例中,如果我动态地从data属性中提取值,则由于某种原因,
RegExp
的构造函数无法正确解释双斜杠。但是,如果我将该值复制并粘贴为字符串,并对该值调用
RegExp
,它将正确解释双斜杠并以正确的模式返回它


我还尝试了在服务器端通过双斜杠不转义
\d
字符,但正如您可能(或可能不)猜到的,情况正好相反。从attributes/dataset中提取时,\被完全删除,导致正则表达式认为我在查找“d”字符而不是数字。我无法理解JS在这里的想法。请发送帮助,Internet

您的数据属性有多余的反斜杠。在HTML属性中不需要转义反斜杠,所以实际上会在不需要反斜杠的地方得到一个双反斜杠。当然,在JavaScript中以字符串形式编写正则表达式时,必须避开反斜杠


因此,实际上两边的字符串并不相同,这仅仅是因为转义的工作方式不同。

显然,我实际上是疯了,或者一定是在第一次测试中输入了错误的内容,因为我刚刚使用非转义html属性(即仅对
\d
进行了单斜杠)再次尝试,并且它工作正常。我仍然不确定我是否完全理解为什么属性本身并不等同于字符串的原因。如果我添加另一个类似的
并运行
element.dataset.bork==“bork”
它将返回
true
。为什么
data regex=“\bork”=“\bork”
”的情况不同?因为该字符串中的
\b
实际上是退格字符,而该属性中的
\b
是两个字符\和b。您也可以反向操作,例如
&apos
,而它是确切的字母
&apos放置在JS字符串中时。
<span data-regex="(^\\d{5}$)|(^\\d{5}-\\d{4}$)"></span>
new RegExp($0.dataset.regex)
//returns /(^\\d{5}$)|(^\\d{5}-\\d{4}$)/

new RegExp($($0).data('regex'))
//returns /(^\\d{5}$)|(^\\d{5}-\\d{4}$)/

new RegExp("(^\\d{5}$)|(^\\d{5}-\\d{4}$)");
//returns /(^\d{5}$)|(^\d{5}-\d{4}$)/