Javascript regexp exec不';行不通
最近我在JS中发布了关于通过正则表达式进行时间格式转换的文章 现在我稍微修改了代码Javascript regexp exec不';行不通,javascript,regex,Javascript,Regex,最近我在JS中发布了关于通过正则表达式进行时间格式转换的文章 现在我稍微修改了代码 function getHours(value) { if (value == 0) return 0; var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g"); var myArray = re.exec(value); var hours = 0; var minutes = 0; if (myArray !
function getHours(value) {
if (value == 0)
return 0;
var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
var myArray = re.exec(value);
var hours = 0;
var minutes = 0;
if (myArray != null) {
if (myArray[2] != null) {
hours = myArray[2];
}
if (myArray[5] != null) {
minutes = myArray[5];
}
}
return Number(hours) + Number(minutes) / 60;
}
问题是它在myArray
中返回一个null
值
因为我是JS新手,所以无法解决这个问题。我做错了什么?我更改了exec调用,如下所示:
var myArray=(/^(?=\d)((\d+)(h:)?\s*(\d+)m?$/g)代码>
成功了!有人能解释一下区别吗?问题就在这里
new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
通过构造函数创建新的正则表达式时,提供字符串。在字符串文字中,反斜杠字符(\
)表示“转义下一个字符”
你必须避开那些反斜杠,这样它们就不会避开后面的角色。因此,正确的版本是:
new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");
有关JavaScript中转义字符的更多信息,请参阅。问题在这一行:
var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
请理解,RegExp类
以字符串作为参数来构造,您需要双转义\d
和\s
才能被正则表达式引擎正确解释,因此\d
应该变成\\d
,而\s
应该变成RegEx字符串中的\\s
,如下所示:
var re = new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");
请注意,您还可以执行以下操作:
var re = /^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g;
将value
变量的值张贴到它可以是{“11h20m”、“11h”、“20”、“20m”、“11:20”中的一个
应该(?=\d)
做什么?有x(?=y)
,这意味着仅当x后跟y时才与x匹配,但是您错过了前面的值。@zeroflagL这意味着sting必须以开头digit@StNickolas您已经有\d+
(一个或多个数字)作为第一个值,因此它必须以数字开头。初始化错误,try:var re=new RegExp(/^(?=\d)((\d+)(h:)?\s*(\d+)?$/g)
。JavaScript字符串转义“\”符号,这就是为什么您初始化了完全不同的RegExp
。