Javascript 正则表达式文本匹配
我写了一些regexp。当我在控制台中使用键入的字符串执行它时,它会工作,但在某些情况下,脚本中不会 以下是我的控制台输出:Javascript 正则表达式文本匹配,javascript,regex,match,Javascript,Regex,Match,我写了一些regexp。当我在控制台中使用键入的字符串执行它时,它会工作,但在某些情况下,脚本中不会 以下是我的控制台输出: >正文 [“版本:2.1”,“N:;S Wicius;;;”,“FN:S Wicius”,“电话;首选;手机:000000000”] >记录行 /^([^:;]+)(?:;([^:]+)?:(.+)$/gm >records.line.exec(正文[1]) 无效的 >正文[1]=“N:;S Wicius;;” 真的 >records.line.exec(“N:;S Wi
>正文
[“版本:2.1”,“N:;S Wicius;;;”,“FN:S Wicius”,“电话;首选;手机:000000000”]
>记录行
/^([^:;]+)(?:;([^:]+)?:(.+)$/gm
>records.line.exec(正文[1])
无效的
>正文[1]=“N:;S Wicius;;”
真的
>records.line.exec(“N:;S Wicius;;”)
[“N:;S Wicius;;;”,“N”,未定义,“S Wicius;;;”]
>对于(变量i=0;i
它看起来像body[1]
实际上不是一个字符串,而是一个对象,其“ToPrimitive”操作产生“N:;S Wicius;;;”
。因此,尽管body[1]=“N:;S Wicius;;”
是真的(如您所见),body[1]=“N:;S Wicius;;”
将是假的
如果要对body[1]
的字符串值执行正则表达式匹配,可以执行以下操作:
records.line.exec( '' + body[1] )
看起来body[1]
实际上不是一个字符串,而是一个对象,其“ToPrimitive”操作产生“N:;S Wicius;;”
。因此,尽管body[1]=“N:;S Wicius;;”
是真的(如您所见),body[1]=“N:;S Wicius;;”
将是假的
如果要对body[1]
的字符串值执行正则表达式匹配,可以执行以下操作:
records.line.exec( '' + body[1] )
那么这个问题呢是由以下因素综合造成的:
records.line在每次迭代中都是相同的对象
正则表达式是用/g修饰符和
exec
方法更改regexp对象的属性
lastIndex是RegExp对象的读/写属性。定期
表达式,它包含一个
指定紧跟在最后一次匹配之后的字符位置
由RegExp.exec()和RegExp.test()方法找到。这些方法
使用此属性作为下一次搜索的起点
行为
此属性允许您重复调用这些方法,以
循环遍历字符串中的所有匹配项,并且仅当“g”为
修改器已设置
您可以通过更改这3个条件中的任何一个来修复此问题(您还可以在每次迭代中手动重置records.line.lastIndex=0
)。您的/g修饰符似乎没用,所以请将其删除。好吧,问题是由以下因素组合而成的:
records.line在每次迭代中都是相同的对象
正则表达式是用/g修饰符和
exec
方法更改regexp对象的属性
lastIndex是RegExp对象的读/写属性。定期
表达式,它包含一个
指定紧跟在最后一次匹配之后的字符位置
由RegExp.exec()和RegExp.test()方法找到。这些方法
使用此属性作为下一次搜索的起点
行为
此属性允许您重复调用这些方法,以
循环遍历字符串中的所有匹配项,并且仅当“g”为
修改器已设置
您可以通过更改这3个条件中的任何一个来修复此问题(您还可以在每次迭代中手动重置records.line.lastIndex=0
)。您的/g修饰符似乎没用,所以请将其删除。您想做什么?你能解释得更清楚一点吗?body[1]
确实是那个字符串,而且body
不是稀疏数组吗?body[1]的类型产生“字符串”。我想解析它以解析“body”数组中的所有字符串。body
是由\n
分割的文本。这会引起问题吗?你想做什么?你能解释得更清楚一点吗?body[1]
确实是那个字符串,而且body
不是稀疏数组吗?body[1]的类型产生“字符串”。我想解析它以解析“body”数组中的所有字符串。body
是由\n
分割的文本。这会导致问题吗?body[1]==“N:;S Wicius;;;”
为真records.line.exec(“”+body[1])
可以工作,但它是一种变通方法:我错了records.line.exec(“”+body[1])
工作,但仅在控制台中工作。body[1]==“N:;S Wicius;;”
为truerecords.line.exec(“”+body[1])
可以工作,但它是一种变通方法:我错了records.line.exec(“”+body[1])
可以工作,但只能在控制台中工作。就是这样/g修改器不应该在那里!就这样/g修改器不应该在那里!