[英]Stuck with javascript regular expression grouping
我有五個具有相同部分的正則表達式。 所有零件都有?
最后是可選的,但順序必須保持不變。 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');
}
這就是我初始化正則表達式列表的方式,它不是偽代碼(除了正則表達式及其名稱)。
這可能不是您要搜索的確切解決方案。 但是您可以編寫如下所示的函數來實現所需的功能
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");
我將使用此表達式,只有幾個表達式具有相同的部分。
^((title1\s+(type\s)?column(\soption)?)|((title2|title3) (name\s)?(type\s)?column(\soption)?)|(title4(\sname)?\s+column(\soption)?)|(title5(\sname)?\s+column other))$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.