匹配不以前两个特定字符开头的行

时间:2016-06-14 11:25:45

标签: regex grep pcre

我试图匹配那些不以" CD"开头的行。或任何2位数字。我试过了:

^[^Cc0-9][^Dd0-9].+?$

但它与以" Cx"开头的行不匹配或" 0y"。

我使用名为rxrepl的程序,上面的正则表达式作为搜索字符串,没有任何替代品。我试图避免使用grep。此外,我不能使用括号,因为在rxrepl中它们用于捕获组。

2 个答案:

答案 0 :(得分:3)

正如其他人所说,你需要

function pushUniqueSinglePass(array, unique) {
  var prev; // last element seen
  var run = 0; // number of times it has been seen
  for (var i = 0; i < array.length; i++) {
    if (array[i] != prev) {
      if (run == 1) {
        unique.push(prev); // "prev" appears only once
      }
      prev = array[i];
      run = 1;
    } else {
      run++;
    }
  }
}

function pushUniqueWithSet(array, unique) {
  var set = new Set();
  for (var i = 0; i < array.length; i++) {
    set.add(array[i]);
  }
  for (let e of set) {
    unique.push(set);
  }
}

// Utility and test functions

function randomSortedArray(n, max) {
  var array = [];
  for (var i = 0; i < n; i++) {
    array.push(Math.floor(max * Math.random()));
  }
  return array.sort();
}

function runtest(i) {
  var array = randomSortedArray(i, i / 2);
  var r1 = [],
    r2 = [];
  console.log("Size:        " + i);
  console.log("Single-pass: " + time(
    pushUniqueSinglePass, array, r1));
  console.log("With set:    " + time(
    pushUniqueWithSet, array, r2));
  // missing - assert r1 == r2
}

[10, 100, 1000, 10000,
  100000, 1000000
].forEach(runtest);


function time(fun, array, unique) {
  var start = new Date().getTime();
  fun(array, unique);
  return new Date().getTime() - start;
}

^(?:CD|\d\d) 非捕获

或者,如果必须避免使用任何类型的括号,请使用

(?: ... )


更新

为了符合您的新规范“我实际上是在尝试匹配 以CD或2位数字开头

^CD|^\d\d

你需要用括号来克服你的问题。否定前瞻是fine in PCRE无法捕获

答案 1 :(得分:2)

CD或两个数字。所以你必须使用这样的组(group1|group2)

^(CD|[0-9]{2})
# ^^ ^^^^^^^^
# |         |   
# either CD |
#           or two digits