最近我通过JS中的正则表达式发布了a question关于时间格式转换的内容。
现在我修改了一下代码。
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;
}
问题是它在null
中返回myArray
值。
由于我是JS的新手,我无法解决这个问题。我做错了什么?
答案 0 :(得分:1)
问题出在这里
new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
通过构造函数创建新的正则表达式时,提供字符串。在字符串文字中,反斜杠字符(\
)表示“转义下一个字符”。
你必须逃避那些反斜杠,所以他们不会逃避他们后续的角色。所以正确的版本是:
new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");
有关在JavaScript中转义字符的详细信息,请参阅this article on values, variables, and literals from MDN。
答案 1 :(得分:1)
问题出在这一行:
var re = new RegExp("^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$", "g");
请理解RegExp class
将String作为构造的参数,您需要双重转义\d
和\s
才能被RegEx引擎正确解释,因此\d
应该成为\\d
\s
和\\s
应该在你的正则表达式字符串中成为var re = new RegExp("^(?=\\d)((\\d+)(h|:))?\\s*((\\d+)m?)?$", "g");
,如下所示:
var re = /^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g;
请注意,您也可以这样做:
{{1}}
答案 2 :(得分:0)
我改变了这样的exec调用:
var myArray = (/^(?=\d)((\d+)(h|:))?\s*((\d+)m?)?$/g).exec(value);
它有效!任何人都可以解释这种差异吗?