【问题标题】:regex text matching正则表达式文本匹配
【发布时间】:2012-02-19 17:13:28
【问题描述】:

我写了一些正则表达式。当我使用在控制台中键入的字符串执行它时它可以工作,但在某些情况下在我的脚本中却不行。

这是我的控制台输出:

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

【问题讨论】:

  • 你想做什么?你能解释清楚一点吗?
  • body[1] 确实是那个字符串,body 不是稀疏数组吗?
  • typeof body[1] 产生“字符串”。我想解析它以解析“body”数组中的所有字符串。
  • body 是由\n 分割的文本。这会导致问题吗?

标签: javascript regex match


【解决方案1】:

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

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

lastIndex 是 RegExp 对象的读/写属性。对于常规 具有“g”属性集的表达式,它包含一个整数 指定紧跟最后一个匹配的字符位置 由 RegExp.exec( ) 和 RegExp.test( ) 方法找到。这些方法 使用此属性作为下一次搜索的起点 执行。

此属性允许您重复调用这些方法,以 循环遍历字符串中的所有匹配项,并且仅在“g”时才有效 修饰符已设置。

您可以通过更改这 3 个条件中的任何一个来解决此问题(您也可以在每次迭代中手动重置 records.line.lastIndex = 0)。你的 /g 修饰符似乎没用,所以把它去掉吧。

【讨论】:

  • 就是这样! /g 修饰符不应该在那里!
【解决方案2】:

看起来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] )

【讨论】:

  • body[1] === "N:;S Wicius;;;" 是真的。 records.line.exec( '' + body[1] ) 有效,但它是解决方法。 :
  • 我错了。 records.line.exec( '' + body[1] ) 有效,但仅在控制台中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2021-02-14
相关资源
最近更新 更多