正则表达式文本匹配

时间:2012-02-19 17:13:29

标签: javascript regex match

我写了一些正则表达式。当我在控制台中输入字符串时执行它,但在某些情况下在我的脚本中不能执行它。

这是我的控制台输出:

>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"]

2 个答案:

答案 0 :(得分:1)

嗯,问题是由以下因素综合造成的:

  1. records.line是每次迭代中的同一个对象
  2. 正则表达式使用/ g修饰符和
  3. 定义
  4. exec方法更改了正则表达式对象的lastIndex属性
  5.   

    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] )