当你觉得已经出来答案时,那并不是答案。。。
/**
* 判断标题是否可以通过替换模板中的通配符生成
* @param template 含有通配符的创意模板
* @param titles 需要判断的标题数组
* @returns 判断结果数组,每个元素为"True"或"False"
*/
const checkTitlesFromTemplate = (template: string, titles: string[]): string[] => {
// 将模板转换为正则表达式
const parts = template.split(/\{[^}]*\}/);
const regexStr = parts.map(part => escapeRegExp(part)).join('(.*)');
const regex = new RegExp(`^${regexStr}$`);
// 判断每个标题是否匹配
return titles.map(title => {
return regex.test(title) ? "True" : "False";
}).join(',');
};
/**
* 转义正则表达式中的特殊字符
*/
const escapeRegExp = (string: string): string => {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};
/**
* 判断标题是否可以通过替换模板中的通配符生成
* @param template 含有通配符的创意模板
* @param titles 需要判断的标题数组
* @returns 判断结果数组,每个元素为"True"或"False"
*/
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
// 解析模板,提取固定部分和通配符位置
const templateParts: string[] = [];
let currentPos = 0;
let inWildcard = false;
for (let i = 0; i < template.length; i++) {
if (template[i] === '{') {
if (!inWildcard) {
templateParts.push(template.substring(currentPos, i));
currentPos = i + 1;
inWildcard = true;
}
} else if (template[i] === '}') {
if (inWildcard) {
currentPos = i + 1;
inWildcard = false;
}
}
}
// 添加最后一部分
if (currentPos < template.length) {
templateParts.push(template.substring(currentPos));
}
// 过滤掉空字符串
const fixedParts = templateParts.filter(part => part !== '');
// 检查每个标题
return titles.map(title => {
return isMatchTemplate(title, fixedParts) ? "True" : "False";
}).join(',');
};
/**
* 检查标题是否匹配模板的固定部分
*/
const isMatchTemplate = (title: string, fixedParts: string[]): boolean => {
if (fixedParts.length === 0) {
return true; // 如果模板只有通配符,任何标题都匹配
}
let currentPos = 0;
for (let i = 0; i < fixedParts.length; i++) {
const part = fixedParts[i];
const pos = title.indexOf(part, currentPos);
if (pos === -1) {
return false; // 找不到固定部分
}
// 特殊处理第一个和最后一个固定部分
if (i === 0 && pos !== 0 && !title.startsWith(part)) {
// 如果模板不是以通配符开头,标题必须以第一个固定部分开头
if (!template.startsWith('{')) {
return false;
}
}
if (i === fixedParts.length - 1 && !title.endsWith(part)) {
// 如果模板不是以通配符结尾,标题必须以最后一个固定部分结尾
if (!template.endsWith('}')) {
return false;
}
}
currentPos = pos + part.length;
}
return true;
};
export {
// ... 其他导出
checkTitlesFromTemplate,
};
/**
* 判断标题是否可以通过替换模板中的通配符生成
* @param template 含有通配符的创意模板
* @param titles 需要判断的标题数组
* @returns 判断结果数组,每个元素为"True"或"False"
*/
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
// 解析模板,提取固定部分和通配符位置
const parts: {text: string, isWildcard: boolean}[] = [];
let currentText = '';
let inWildcard = false;
for (let i = 0; i < template.length; i++) {
if (template[i] === '{') {
if (!inWildcard) {
if (currentText) {
parts.push({text: currentText, isWildcard: false});
currentText = '';
}
inWildcard = true;
} else {
currentText += template[i];
}
} else if (template[i] === '}') {
if (inWildcard) {
parts.push({text: currentText, isWildcard: true});
currentText = '';
inWildcard = false;
} else {
currentText += template[i];
}
} else {
currentText += template[i];
}
}
// 添加最后一部分
if (currentText) {
parts.push({text: currentText, isWildcard: false});
}
// 检查每个标题
return titles.map(title => {
return isMatchTemplate(title, parts) ? "True" : "False";
}).join(',');
};
/**
* 检查标题是否匹配模板
*/
const isMatchTemplate = (title: string, parts: {text: string, isWildcard: boolean}[]): boolean => {
// 使用动态规划检查是否匹配
return matchWithDP(title, parts, 0, 0);
};
/**
* 使用动态规划检查标题是否匹配模板
*/
const matchWithDP = (
title: string,
parts: {text: string, isWildcard: boolean}[],
titleIndex: number,
partIndex: number
): boolean => {
// 如果已经处理完所有部分和标题,则匹配成功
if (partIndex === parts.length) {
return titleIndex === title.length;
}
const currentPart = parts[partIndex];
// 如果是通配符,可以匹配任意字符串
if (currentPart.isWildcard) {
// 尝试匹配下一个非通配符部分
if (partIndex + 1 < parts.length && !parts[partIndex + 1].isWildcard) {
const nextPart = parts[partIndex + 1].text;
// 尝试不同的通配符长度
for (let i = titleIndex; i <= title.length; i++) {
const nextPos = title.indexOf(nextPart, i);
if (nextPos !== -1) {
if (matchWithDP(title, parts, nextPos + nextPart.length, partIndex + 2)) {
return true;
}
} else {
break;
}
}
return false;
} else {
// 如果是最后一个部分或者下一个也是通配符,可以匹配剩余所有字符
return matchWithDP(title, parts, title.length, partIndex + 1);
}
} else {
// 非通配符必须精确匹配
if (titleIndex + currentPart.text.length > title.length) {
return false;
}
if (title.substring(titleIndex, titleIndex + currentPart.text.length) !== currentPart.text) {
return false;
}
return matchWithDP(title, parts, titleIndex + currentPart.text.length, partIndex + 1);
}
};
/**
* 判断标题是否可以通过替换模板中的通配符生成
* @param template 含有通配符的创意模板
* @param titles 需要判断的标题数组
* @returns 判断结果数组,每个元素为"True"或"False"
*/
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
// 将模板分割成固定部分和通配符部分
const parts: string[] = [];
let isWildcard: boolean[] = [];
let currentText = '';
let inWildcard = false;
for (let i = 0; i < template.length; i++) {
if (template[i] === '{') {
if (!inWildcard) {
if (currentText) {
parts.push(currentText);
isWildcard.push(false);
currentText = '';
}
inWildcard = true;
} else {
currentText += template[i];
}
} else if (template[i] === '}') {
if (inWildcard) {
parts.push(currentText);
isWildcard.push(true);
currentText = '';
inWildcard = false;
} else {
currentText += template[i];
}
} else {
currentText += template[i];
}
}
if (currentText) {
parts.push(currentText);
isWildcard.push(false);
}
// 检查每个标题
const results: string[] = [];
for (const title of titles) {
let canMatch = true;
let titlePos = 0;
// 特殊处理:如果模板不是以通配符开头,标题必须以第一个固定部分开头
if (!isWildcard[0] && !title.startsWith(parts[0])) {
results.push("False");
continue;
}
// 特殊处理:如果模板不是以通配符结尾,标题必须以最后一个固定部分结尾
if (!isWildcard[isWildcard.length - 1] && !title.endsWith(parts[parts.length - 1])) {
results.push("False");
continue;
}
// 处理开头的非通配符部分
if (!isWildcard[0]) {
titlePos = parts[0].length;
}
// 处理中间部分
for (let i = isWildcard[0] ? 0 : 1; i < parts.length - (isWildcard[isWildcard.length - 1] ? 0 : 1); i++) {
if (!isWildcard[i]) {
// 非通配符部分需要在标题中找到
const pos = title.indexOf(parts[i], titlePos);
if (pos === -1) {
canMatch = false;
break;
}
titlePos = pos + parts[i].length;
}
}
// 处理结尾的非通配符部分
if (canMatch && !isWildcard[isWildcard.length - 1]) {
if (!title.endsWith(parts[parts.length - 1])) {
canMatch = false;
}
}
results.push(canMatch ? "True" : "False");
}
return results.join(',');
};
/**
* 判断标题是否可以通过替换模板中的通配符生成
* @param template 含有通配符的创意模板
* @param titles 需要判断的标题数组
* @returns 判断结果数组,每个元素为"True"或"False"
*/
const checkTitles
到这里,可能是因为生成篇幅过长了,导致这里戛然而止。 trae你是好样的,成功吊起来我的。。。
/**
* 判断标题是否可以通过替换模板中的通配符生成
* @param template 含有通配符的创意模板
* @param titles 需要判断的标题数组
* @returns 判断结果数组,每个元素为"True"或"False"
*/
const checkTitlesFromTemplate = (template: string, titles: string[]): string => {
// 将模板转换为正则表达式
const regexParts: string[] = [];
let currentPos = 0;
// 查找所有通配符位置
const wildcardRegex = /\{[^}]*\}/g;
let match;
while ((match = wildcardRegex.exec(template)) !== null) {
// 添加通配符前的固定文本
if (match.index > currentPos) {
regexParts.push(escapeRegExp(template.substring(currentPos, match.index)));
}
// 添加通配符对应的正则
regexParts.push('(.*)');
currentPos = match.index + match[0].length;
}
// 添加最后一部分固定文本
if (currentPos < template.length) {
regexParts.push(escapeRegExp(template.substring(currentPos)));
}
// 构建完整的正则表达式
const regex = new RegExp('^' + regexParts.join('') + '$');
// 检查每个标题
return titles.map(title => regex.test(title) ? "True" : "False").join(',');
};
/**
* 转义正则表达式中的特殊字符
*/
const escapeRegExp = (string: string): string => {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};
看到这里,你觉得trae的思路和你的思路有啥区别?评论区告诉我。