【问题标题】:Regular expressions return same duplicate answer正则表达式返回相同的重复答案
【发布时间】:2013-09-18 21:26:45
【问题描述】:

我正在使用 JavaScript 正则表达式解析 FortiGate 日志,并且在返回重复值时遇到了一些麻烦。这是我的字符串:

Jan 30 12:14:26 [23.4.56.4] date=2013-01-30,time=12:14:26,devname=FGT60C3G665236574,device_id=FGT60C3G665236574,log_id=0021000002,type=traffic,subtype=allowed,pri=notice,vd=root,src=10.10.89.107,src_port=59216,src_int=""internal"",dst=15.26.25.195,dst_port=53640,dst_int=""wan1"",SN=556987,status=accept,policyid=1,dir_disp=org,tran_disp=snat,proto=6,duration=120,sent=240,rcvd=238,sent_pkt=4,rcvd_pkt=3

我正在使用以下正则表达式来获取 devname

/devname=(.*?),/

这是我运行以下代码时返回的内容

var reDeviceName = /devname=(.*?),/;

var log3='Jan 30 12:14:26 [23.4.56.4] date=2013-01-30,time=12:14:26,devname=FGT60C3G665236574,device_id=FGT60C3G665236574,log_id=0021000002,type=traffic,subtype=allowed,pri=notice,vd=root,src=10.10.89.107,src_port=59216,src_int=""internal"",dst=15.26.25.195,dst_port=53640,dst_int=""wan1"",SN=556987,status=accept,policyid=1,dir_disp=org,tran_disp=snat,proto=6,duration=120,sent=240,rcvd=238,sent_pkt=4,rcvd_pkt=3';

console.log(log3.match(new RegExp(reDeviceName)));

这是返回的内容:

 [0] => devname=FGT60C3G665236574
 [1] => devname=
 [2] => FGT60C3G665236574

我怎样才能返回介于两者之间的内容 devname=FGT60C3G665236574,

只返回一个信息 FGT60C3G665236574 的实例

【问题讨论】:

  • 它返回["devname=FGT60C3G665236574,", "FGT60C3G665236574"],这很好,第一个索引始终包含完整匹配,当您有捕获组时,它们从索引 1 开始。
  • 获得 FGT60C3G665236574 的最佳方法是什么?如您所见,索引有 3 个条目,我怎么能只有 1 个?
  • 您当前的代码返回我在上面发布的那个数组,试试看。您需要做的就是获取第二个索引:jsbin.com/iSeYIRU/1/edit

标签: javascript regex return instance


【解决方案1】:

你可以使用:

console.log(log3.match(new RegExp(reDeviceName))[1]);

jsfiddle.

请注意,实际数组没有您在问题中提到的第一个元素。

注意可以直接使用:

var reDeviceName = /devname=(.*?),/;

var log3='Jan 30 12:14:26 [23.4.56.4] date=2013-01-30,time=12:14:26,devname=FGT60C3G665236574,device_id=FGT60C3G665236574,log_id=0021000002,type=traffic,subtype=allowed,pri=notice,vd=root,src=10.10.89.107,src_port=59216,src_int=""internal"",dst=15.26.25.195,dst_port=53640,dst_int=""wan1"",SN=556987,status=accept,policyid=1,dir_disp=org,tran_disp=snat,proto=6,duration=120,sent=240,rcvd=238,sent_pkt=4,rcvd_pkt=3';

console.log(log3.match(redeviceName)[1]);

[省略new RegExp()构造函数]

【讨论】:

  • 根本不需要在代码中的任何地方使用new RegExp。赋值 reDeviceName = /blah/ 已经是一个 RegExp 实例。
  • @TedHopp 哦,对不起,我虽然它有点类似于 python,因为如果必须多次使用正则表达式,使用构造函数可以提高性能。现在一切都好。
猜你喜欢
  • 1970-01-01
  • 2012-08-22
  • 2018-03-14
  • 1970-01-01
  • 2019-08-12
  • 2023-04-06
  • 1970-01-01
  • 2018-04-15
相关资源
最近更新 更多