0

我有五个不同的正则表达式,它们有共同的部分。?末尾的所有部分都是可选的,但顺序必须保持不变。title1-title6是正则表达式彼此不同的地方。

我如何对这些进行分组以消除公共部分的重复?

伪代码如下:

title1       type? column option?
title2 name? type? column option?
title3 name? type? column option?
title4 name?       column option?
title5 name?       column other

到目前为止,我所拥有的是:

(title1 type?|(title2|title3) name? type?|(title4|title5) name?) column option?

除了重复之外,我不知道other为最后一个正则表达式添加部分的最佳方法是什么。

编辑

我决定坚持我最初的计划,将所有正则表达式分开,因为我必须从中提取大量变量。如果有人好奇我的解决方案是什么:

var blocks = {
  name1: /regex1/,
  name2: /regex2/,
  name3: /regex3/,
  ...
};

var regex = [
  createRegex(['name1', 'name2', 'name3', ...]),
  createRegex(['name1', 'name3', 'name4', ...]),
  ...
];

function createRegex = function (params) {
  var regex = '';
  for (var i=0; i < params.length; i++) {
    var name = params[i];
    regex += blocks[name].source;
  }
  return new RegExp(regex, 'i');
}

这就是我初始化正则表达式列表的方式,它不是伪代码(正则表达式及其名称除外)。

4

2 回答 2

1

这可能不是您正在寻找的确切解决方案。但是你可以写一个如下所示的函数来实现你所需要的

function getRegExp() {
    var regExp = "";
    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i]) {
            if (typeof(arguments[i]) == "string") {
                regExp += "(" + arguments[i] + ")";
            } else if (arguments[i].length) {
                regExp += "(" + arguments[i].join("|") + ")";
            }
        }
    }
    return new RegExp(regExp);
}

var regExp = getRegExp(["title1", "title2", "title3", "title4", "title5"], " ", "name?", " ", "type?", " ", "column", " ", ["option?", "other"]);
console.log(regExp);
regExp.test("title1 name type column option");
于 2012-09-10T19:56:27.240 回答
0

我会使用这个表达式,只有少数表达式有共同的部分。

^((title1\s+(type\s)?column(\soption)?)|((title2|title3) (name\s)?(type\s)?column(\soption)?)|(title4(\sname)?\s+column(\soption)?)|(title5(\sname)?\s+column other))$
于 2012-09-10T19:21:57.347 回答