我正在尝试为正则表达式创建匹配项,但是它一直在说它为“ null”。我用完全相同的方式声明了一个不同的变量,它可以很好地拉回值。
我已经向.exec添加了一个等待,该等待用于其他变量声明。
我确保所有内容的拼写正确,并且所有变量均被正确引用。
//RegEx I am using
var ecommerceRegEx = /((?<time>\d+:\d+) (?<modifier>[AP])M (?<timezone>[A-Z]+))/gm
//Object I am getting the DOM property for
var ecommercePortalAppointmentTime = await Selector('[class="availability-option"]').find('span').nth(0).innerText
//Match I am attempting to create
var ecommercePortalMatch = ecommerceRegEx.exec(await ecommercePortalAppointmentTime)
//Console.log I am verifying the value is returned correctly
console.log("Ecomm Match: " + ecommercePortalMatch)
//Returns 'null'
预期结果:应使用每个组的值创建一个数组。例如,如果字符串是:“您的约会在CDT 9:00 AM”,则数组应为[9:00,AM,CDT]
实际结果:返回“ null”
答案 0 :(得分:1)
摆脱正则表达式中的g
修饰符。仅当在循环中使用regexp在单个字符串中查找所有匹配项时,才应与.exec()
一起使用。它使regexp记住字符串在比赛中结束的位置,以便下一个调用可以在此之后寻找比赛。
但是,如果将正则表达式与其他字符串一起使用,它将开始从在前一个字符串中找到匹配项的索引中查找该字符串。如果是在此字符串中的匹配项之后,它将找不到它。
在使用g
返回数组中某个正则表达式的所有匹配项时,.match()
修饰符也很有用(但是您无法获取捕获组,这就是您的原因),并且用.replace()
替换所有匹配项。
答案 1 :(得分:0)
await
中的第二个ecommerceRegEx.exec
没有意义。您已经使用await
来获取该变量。
此外,您的正则表达式不是有效的JavaScript正则表达式,因为JS不支持命名捕获组。看起来在regex101.com上调试时,您使用了PHP选项。您可以在左侧菜单上进行更改。
尝试一下:
//RegEx I am using
var ecommerceRegEx = /((\d+:\d+) ([AP])M ([A-Z]+))/gm
//Object I am getting the DOM property for
var ecommercePortalAppointmentTime = await Selector('[class="availability-option"]').find('span').nth(0).innerText
//Match I am attempting to create
var ecommercePortalMatch = ecommerceRegEx.exec(ecommercePortalAppointmentTime)