正则表达式只返回第一场比赛?

时间:2014-09-08 09:03:06

标签: javascript regex node.js

我有一个包含很多行的文本文件,我正在过滤它们以找到我需要的内容,例如:

HBIJB LX 0359 25Aug14 07:37

这是我的正则表达式:

/(?:(HB...)\s(LX|WK)\s((?:[0-9]){1,4})\s((?:[0-9]){2}(?:[A-Z,a-z]){3}(?:[0-9]){2})\s((?:[0-9]){2}:(?:[0-9]){2}))/g

我的问题是它只返回文件中的第一个匹配项:

[ 
  'HBIJB LX 0359 25Aug14 07:37',
  'HBIJB',
  'LX',
  '0359',
  '25Aug14',
  '07:37',
  index: 323,
  input: /* Omitted */
]

响应是完美的,但是为什么我只获得第一场比赛,即使我使用全球/g旗帜?

修改

我正在使用NodeJs,脚本没什么特别的:

var regex = /(?:(HB...)\s(LX|WK)\s((?:[0-9]){1,4})\s((?:[0-9]){2}(?:[A-Z,a-z]){3}(?:[0-9]){2})\s((?:[0-9]){2}:(?:[0-9]){2}))/g
console.log(regex.exec(data));

编辑2:

这里是我需要过滤的内容的推断。

Lorem Ipsum Ø HBIJB LX 0359 25Aug14 07:37 HBIPV LX 2092 25Aug14 09:09
Lorem Ø HBIJB LX 1404 25Aug14 09:59 HBIJB LX 1405 25Aug14 10:53

2 个答案:

答案 0 :(得分:2)

它适用于我,

> var s = "Lorem Ipsum Ø HBIJB LX 0359 25Aug14 07:37 HBIPV LX 2092 25Aug14 09:09\nLorem Ø HBIJB LX 1404 25Aug14 09:59 HBIJB LX 1405 25Aug14 10:53";
undefined
> console.log(s)
Lorem Ipsum Ø HBIJB LX 0359 25Aug14 07:37 HBIPV LX 2092 25Aug14 09:09
Lorem Ø HBIJB LX 1404 25Aug14 09:59 HBIJB LX 1405 25Aug14 10:53
undefined
> m = s.match((?:(HB...)\s(LX|WK)\s((?:[0-9]){1,4})\s((?:[0-9]){2}(?:[A-Z,a-z]){3}(?:[0-9]){2})\s((?:[0-9]){2}:(?:[0-9]){2})))
> m = s.match(/(?:(HB...)\s(LX|WK)\s((?:[0-9]){1,4})\s((?:[0-9]){2}(?:[A-Z,a-z]){3}(?:[0-9]){2})\s((?:[0-9]){2}:(?:[0-9]){2}))/g);
[ 'HBIJB LX 0359 25Aug14 07:37',
  'HBIPV LX 2092 25Aug14 09:09',
  'HBIJB LX 1404 25Aug14 09:59',
  'HBIJB LX 1405 25Aug14 10:53' ]

答案 1 :(得分:1)

这是 Avinash Raj 提供的正确答案的澄清和扩展。

问题是我正在使用RegExp.prototype.exec()但是对于我打算做的事情,我需要先使用String.prototype.match()

var values = "Lorem Ipsum Ø HBIJB LX 0359 25Aug14 07:37 HBIPV LX 2092 25Aug14 09:09\nLorem Ø HBIJB LX 1404 25Aug14 09:59 HBIJB LX 1405 25Aug14 10:53";
values.match(/(?:(HB...)\s(LX|WK)\s((?:[0-9]){1,4})\s((?:[0-9]){2}(?:[A-Z,a-z]){3}(?:[0-9]){2})\s((?:[0-9]){2}:(?:[0-9]){2}))/g);

values.forEach(function(row) {
  var regex = /(?:(HB...)\s(LX|WK)\s((?:[0-9]){1,4})\s((?:[0-9]){2}(?:[A-Z,a-z]){3}(?:[0-9]){2})\s((?:[0-9]){2}:(?:[0-9]){2}))/g;
  var data = regex.exec(row));
}

这是因为String.prototype.match()返回一个包含与给定RegExp匹配的每个字符串的数组,而RegExp.prototype.exec()返回一个包含给定RegExp匹配的组的数组,如果有多个匹配的字符串,只返回第一个。