正则表达式负面预测javascript

时间:2016-02-14 14:10:22

标签: javascript regex

我的代码从文件中读取一行并替换长度为3到18位的数字。

问题是我不想匹配字符串DOM: 后面的数字(冒号后面的空格)。

例如:

  

匹配: tttt 23456789 dkdkd

     

匹配: 6783456789 dkdkd DOM:

     

不匹配: DOM:23456789 dkdkd

     

不匹配: dhdhd DOM:23456789 dkdkd

     

不匹配: DOM:2789 dkdkd DOM:34567896

我尝试过使用否定预测:.*(?!DOM: )[0-9]{3,18}

但它不起作用,请帮助。

2 个答案:

答案 0 :(得分:2)

由于javascript中无法使用lookbehind,因此无法使用。

解决方法是使用替换方法替换函数:

yourstr = yourstr.replace(/\b(DOM: )?\d{3,18}\b/g, function (m, g) {
    return g ? m : 'what you want'; });

答案 1 :(得分:1)

一种模仿后视镜的常用方法,即不需要前瞻(这里,未使用前瞻),是通过逆转。你反转输入字符串,正则表达式模式,你可以使用 lookahead 而不是lookbehind,然后结果:

function revStr(str) {
    return str.split('').reverse().join('');
}

var s = ["tttt 23456789 dkdkd", "6783456789 dkdkd DOM:",
 "DOM: 23456789 dkdkd", "dhdhd DOM: 23456789 dkdkd", "DOM: 2789 dkdkd DOM: 34567896"];
var rex = /\b[0-9]{3,18}\b(?!\s*:MOD\b)/g;  // Regex for matching reversed numbers 
var results = [];                          // Array for results
s.forEach(function(t) {                    // Test each string
     m = revStr(t).match(rex);             // Collect all matches
     if (m) {                              // If we have a match
         m.forEach(function(h) { 
            results.push(revStr(h));       // Reverse each match value and add
         });
     }
  }
);
document.body.innerHTML = "<pre>" + JSON.stringify(results, 0, 4) + "</pre>";