Javascript正则表达式匹配组

时间:2014-05-23 13:15:13

标签: javascript regex replace match

我有一个多线日志文件,我试图用正则表达式和javascript解析成更具可读性的东西,我已经将这个问题用作参考但是我得到了意想不到的结果Javascript replace with reference to matched group?

基本上是b日志"第一次"未定义"第二次"我希望在哪里看到文件名作为第二个匹配。

以下是我要匹配的正则表达式和数据字符串的示例,这会导致匹配。 http://regex101.com/r/bW9xD4

我正在尝试订购匹配项,以便首先匹配文件名,然后是第一次匹配,然后是第二次匹配,是否有人能指出我正确的方向?

代码

var VIRTUAL = (function() {
  // Module globals
  var $ = {}; 

  // Module methods
  $ = {
    compareDelivery : function( data ) {
      var regex = new RegExp( '(\\d{2}:\\d{2}:\\d{2})|([0-9a-z]+.xml)', 'gmi' ), out = [];

      var found = data.replace(regex, function ( a, b, c ) {
          console.log(a);  

      });

      return out;
    }

  };


  return $;

}());

JSBIN:http://jsbin.com/manej/3/edit?js,console,output

2 个答案:

答案 0 :(得分:1)

通过查看您的数据,也许您可​​以使用这样的模式

"(Time .*?)\\s(Filename .*?)\\s(Generated [^\\n]*)"

和替换者

function ($0, time1, file, time2) {
    // .. do stuff
}

您当前的方法不起作用,因为每个匹配都与前一个匹配;找到它们的唯一原因是g标志。我建议的方式是,匹配会立即在群组中查找所有内容,并且g标记会使其在多行中生效。

答案 1 :(得分:1)

KryptoniteDove,这个简单的代码会这样做(参见online demo中的输出):

<script>
var subject = 'Time 2014-05-22T10:39:04.890117+01:00 Filename S140522DSS10002.xml::938c287eb522359b600f74bb3140bb64 Generated 2014-05-22T10:38:46.000000+01:00';
var regex = /Time.*?(\d{2}:\d{2}:\d{2}).*?([0-9a-z]*\.xml).*?(\d{2}:\d{2}:\d{2})/i;
var match = regex.exec(subject);
if (match != null) {
        document.write(match[2] + "<br>");
        document.write(match[1] + "<br>");
        document.write(match[3] + "<br>");
}
</script>

这是如何运作的?

我们不是尝试多个匹配,而是使用单个正则表达式匹配所有内容,捕获文件名和捕获组1,2和3中的时间。