我写了一些正则表达式。当我在控制台中输入字符串时执行它,但在某些情况下在我的脚本中不能执行它。
这是我的控制台输出:
>body
["VERSION:2.1", "N:;S Wicius;;;", "FN:S Wicius", "TEL;PREF;CELL:000000000"]
>records.line
/^([^:;]+)(?:;([^:]+))?:(.+)$/gm
>records.line.exec( body[1] )
null
>body[1] == "N:;S Wicius;;;"
true
>records.line.exec( "N:;S Wicius;;;" )
["N:;S Wicius;;;", "N", undefined, ";S Wicius;;;"]
>for( var i = 0; i < body.length; i++ ) {
var line = [];
if( line = records.line.exec( body[i] ) )
console.log( line )
}
["VERSION:2.1", "VERSION", undefined, "2.1"]
["FN:S Wicius", "FN", undefined, "S Wicius"]
答案 0 :(得分:1)
嗯,问题是由以下因素综合造成的:
exec
方法更改了正则表达式对象的lastIndex属性lastIndex是RegExp对象的读/写属性。经常 表达式设置为“g”,它包含一个整数 指定紧跟在最后一场比赛之后的角色位置 通过RegExp.exec()和RegExp.test()方法找到。这些方法 使用此属性作为下一次搜索的起点 进行。
此属性允许您重复调用这些方法 循环遍历字符串中的所有匹配,仅在“g”时有效 修饰符已设置。
您可以通过更改这3个条件中的任何一个来解决问题(您还可以在每次迭代中手动重置records.line.lastIndex = 0
)。你的/ g修饰符似乎没用,所以就这样摆脱它。
答案 1 :(得分:0)
看起来body[1]
实际上不是字符串,而是“ToPrimitive”操作产生"N:;S Wicius;;;"
的对象。因此,虽然body[1] == "N:;S Wicius;;;"
为true
(如您所见),但body[1] === "N:;S Wicius;;;"
将为false
。
如果要对body[1]
的字符串值执行正则表达式匹配,可以执行以下操作:
records.line.exec( '' + body[1] )