gpt4 book ai didi

javascript - 如何在 Javascript 中编写一种有效的方法来处理匹配模式?

转载 作者:行者123 更新时间:2023-12-02 23:41:30 24 4
gpt4 key购买 nike

我想生成匹配特定模式的字符串。例如,该函数将采用两个参数:

function parsePattern(pattern, string) {}

可接受的模式可以是“(hello|hi), %i, (how are you|nice to see you)”,并且如果第二个参数以这种方式设置为“John”

parsePattern('(hello|hi), %i, (how are you|nice to see you)', 'John')

我希望输出具有所有可能的组合:

 'hello, John, how are you'
'hello, John, nice to see you'
'hi, John, how are you'
'hi, John, nice to see you'

实现这一目标的最佳方法是什么?

最佳答案

您希望执行与正则表达式通常用途相反的操作,因此不可能使用像 \w+ 这样更通用的正则表达式模式。但是,如果您只是想为 A|B 类型的模式(如您的示例中所示)生成结果,那么这里有一些代码可以完成此任务。这利用 StackOverflow's own formatUnicorn function以及给定的笛卡尔积函数 here 。当然,您可以用自己的替换它们。

JSFiddle:https://jsfiddle.net/aro108zc/

String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
"use strict";
var str = this.toString();
if (arguments.length) {
var t = typeof arguments[0];
var key;
var args = ("string" === t || "number" === t) ?
Array.prototype.slice.call(arguments)
: arguments[0];

for (key in args) {
str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
}
}

return str;
};

function cartesianProduct(arr) {
return arr.reduce(function (a, b) {
return a.map(function (x) {
return b.map(function (y) {
return x.concat([y]);
})
}).reduce(function (a, b) { return a.concat(b) }, [])
}, [[]])
}

function parsePattern(pattern, str) {
var regex = /\(([^|()]+\|)*[^|()]+\)/g;
var results = [];

var matches = pattern.match(regex);

// replace input string match groups with format strings
matches.forEach(function (el, idx) {
pattern = pattern.replace(el, '{' + (idx + 1) + '}');
});

// split matches into parts
var matchesSplit = [];

matches.forEach(function (el, idx) {
matchesSplit[idx] = el.replace(/[()]/g, '').split('|');
});

// generate result strings
matchesSplit.splice(0, 0, [str]);

cartesianProduct(matchesSplit).forEach(function (el) {
results.push(pattern.formatUnicorn(el));
});

return results;
}

关于javascript - 如何在 Javascript 中编写一种有效的方法来处理匹配模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56050545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com