坚持使用javascript正则表达式分组
我有五个不同的正则表达式,它们有共同的部分。末尾带有坚持使用javascript正则表达式分组,javascript,regex,Javascript,Regex,我有五个不同的正则表达式,它们有共同的部分。末尾带有?的所有零件都是可选的,但顺序必须保持不变标题1-标题6是正则表达式彼此不同的地方 我怎样才能将它们分组以消除公共部分的重复 伪代码如下: title1 type? column option? title2 name? type? column option? title3 name? type? column option? title4 name? column option? title5 name?
?
的所有零件都是可选的,但顺序必须保持不变<代码>标题1-标题6
是正则表达式彼此不同的地方
我怎样才能将它们分组以消除公共部分的重复
伪代码如下:
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?
除了重复之外,我不知道为最后一个正则表达式添加其他部分的最佳方法是什么
编辑
我决定坚持我最初的计划,将所有正则表达式分开,因为我必须从它们中提取大量的变量。
如果有人想知道我的解决方案是什么:
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');
}
var块={
名称1:/regex1/,
名称2:/regex2/,
名称3:/regex3/,
...
};
var regex=[
createRegex(['name1','name2','name3',…]),
createRegex(['name1','name3','name4',…]),
...
];
函数createRegex=函数(参数){
var regex='';
对于(变量i=0;i
这就是我初始化正则表达式列表的方式,它不是伪代码(正则表达式及其名称除外)。我将使用此表达式,只有少数表达式具有公共部分
^((title1\s+(type\s)?column(\soption)?)|((title2|title3) (name\s)?(type\s)?column(\soption)?)|(title4(\sname)?\s+column(\soption)?)|(title5(\sname)?\s+column other))$
这可能不是您正在搜索的确切解决方案。但您可以编写如下所示的函数来实现所需的功能
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");
函数getRegExp(){
var regExp=“”;
for(var i=0;i
您为什么不给出模式的真实示例以及您希望从中得到什么?这些只是可以彼此完全分离的组,它们内部没有公共部分,而且本身也很复杂。它们定义了不同的实体,即使可能,我也不想把它们混在一起。我担心情况就是这样。