【问题标题】:javascript eval cannot understand some RegEx in string?javascript eval 无法理解字符串中的某些 RegEx?
【发布时间】:2014-08-21 15:52:25
【问题描述】:

eval 似乎根本不理解RegEx

我得到这个string 来检查在输入 字段中输入的YEAR

RegEx 应该 match 类似:201019801900 之间的任何年份强>2099

RegEx^(19|20)\d{2}$ 在原始 javascript 中运行良好,例如:

var testStr = /^(19|20)\d{2}$/.test(2013) //logs true

但是testStr2 = eval("/^(19|20)\d{2}$/").test(2013) //logs false

请看小提琴:http://jsfiddle.net/zq30puzm/

这被用于:

"getYear":{
                        "regex":"/^(19|20)\d{2}$/",
                        "alertText":"* Invalid Year"
},

输入数据 值得时,它会继续打印 Error 事件。

可能是什么问题?

欢迎提出任何建议。

小提琴: http://jsfiddle.net/zq30puzm/

【问题讨论】:

  • 顺便说一句:eval 是邪恶的。 eval("/.../") 在功能上等同于 new Regexp("..."),但速度要慢得多且安全性较低。几乎 JavaScript 中的所有内容都可以在没有 eval 的情况下完成 - 并且应该是。
  • 好建议:你能告诉我如何用new RegExp 做到这一点吗?我试过; var str=new RegExp("/^(19|20)\d{2}$/"); str.test(2013) //logs false. 如何最好地使用 new RegExp()??
  • 与 Jake King 的答案相同:new Regexp 使用字符串文字作为参数,并且在字符串文字中反斜杠需要转义。

标签: javascript regex string eval


【解决方案1】:

在字符串版本中,需要对反斜杠进行转义。

var testStr2 = eval("/^(19|20)\\d{2}$/").test(2013);

在正则表达式文字中,转义反斜杠是不必要的(除非您需要文字反斜杠),但在字符串中,\d 只是成为字符 d 而无需转义。


请注意,eval 确实应该不惜一切代价避免。您不太可能需要它,而且如果没有充分注意以确保它不会被用于恶意目的,使用它总是很危险。此外,如果您的正则表达式格式错误或发生其他错误,您将不会收到有用的错误消息,它可能会以奇怪的方式中断。

如果可以,请使用 RegExp 文字!它们方便可靠,您不必进行任何不必要的转义:

/^(19|20)\d{2}$/.test(2013);

如果您需要字符串中的正则表达式,请使用构造函数而不是 eval。它会做同样的事情,但更安全。

new RegExp("^(19|20)\\d{2}$").test(2013);

【讨论】:

  • 一个小问题 - RegExp 文字仍然需要转义,例如var result = "thing".match(/^\/\//)eval('var result = "thing".match(/^\/\//)')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多