Вопрос или проблема
Я получаю текст из ответа:
“Сгенерируйте что-то в формате 1:1 для День Рождения
в веселом, праздничном
настроении. Изображение должно быть создано в Граффити
стиле. Текст С Днем Рождения!
находится сверху. Внизу надпись: Лиам
. Графические элементы должны визуально отражать термины звезды, шарики
.”
и иметь строку без значений:
const sub = "Сгенерируйте что-то в формате 1:1 для в настроении. Изображение должно быть создано в стиле. Текст находится сверху. Внизу надпись:. Графические элементы должны визуально отражать термины.";
В каждом ответе слова могут отличаться, например День Рождения->Спасибо, Лиам->Джон Доу, звезды, шарики->фейерверки и многие другие комбинации.
Также базовые строки, prompt
и sub
могут быть на разных языках.
Есть ли способ извлечь выделенные слова (которые будут использоваться для предварительного заполнения некоторых полей ввода)?
Мне удалось сделать это только в том случае, если слова заключены в кавычки, как:
const sub = "Сгенерируйте что-то в формате 1:1 для в настроении. Изображение должно быть создано в стиле. Текст находится сверху. Внизу надпись:. Графические элементы должны визуально отражать термины."
const prompt = "Сгенерируйте что-то в формате 1:1 для 'День Рождения' в 'веселом, праздничном' настроении. Изображение должно быть создано в 'Граффити' стиле. Текст 'С Днем Рождения!' находится сверху. Внизу надпись: 'Лиам'. Графические элементы должны визуально отражать термины 'звезды, шарики'."
const resolvePrompt = (prompt, sub) => {
return prompt
.replaceAll(".", "")
.split(" ")
.filter((wd) => !sub.includes(wd))
.join("")
.split("''");
};
console.log(resolvePrompt(prompt, sub))
</div><div class="s-prose js-post-body" itemprop="text">
Если я прав, я думаю, проблему можно решить так:
const variablePattern = /'([\w\d\s,.;!?\\\-+*=/_\[\]\(\)\{\}@#$%&]*)'/g;
function generateVariableString ( thePrompt )
{
let theIndex = 0;
const variableMatches = thePrompt.matchAll(variablePattern);
for ( const [ theVariable, theContent ] of variableMatches )
{
thePrompt = thePrompt.replace(theVariable, `\${${theIndex++}}`);
}
return thePrompt;
}
function parseVariableString ( thePrompt, theKeyValuePairs )
{
for ( const theIndex in theKeyValuePairs )
{
thePrompt = thePrompt.replace(`\${${theIndex}}`, theKeyValuePairs[theIndex]);
}
return thePrompt;
}
// ТЕСТЫ
var thePrompt = "Сгенерируйте что-то в формате 1:1 для 'День Рождения' в 'веселом, праздничном' настроении. Изображение должно быть создано в 'Граффити' стиле. Текст 'С Днем Рождения!' находится сверху. Внизу надпись: 'Лиам'. Графические элементы должны визуально отражать термины 'звезды, шарики'.";
var newWords = ['Свадьба', 'безумный, неистовый', 'Неон', 'САМЫЙ БЕЗУМНЫЙ', 'СВАДЬБА', 'танцы, музыка, популярность, празднование'];
var variablePrompt = generateVariableString(thePrompt);
var parsedPrompt = parseVariableString(variablePrompt, newWords);
// ЛОГИ
console.log('newWords=", newWords);
console.log("thePrompt=", thePrompt);
console.log("variablePrompt=", variablePrompt);
console.log("parsedPrompt=", parsedPrompt);
var namedVariables = ["${Тема}', '${Настроение}', '${Стиль}', '${ВерхнийТекст}', '${НижнийТекст}', '${Термины}'];
console.log('NEW named variablePrompt=", parseVariableString(variablePrompt, namedVariables));
// БОЛЬШЕ ТЕСТОВ
var variableText = "Это ${Имя}, ${Местоимение} работает в ${Месторасположение} рядом с ${БлизкимМестоположением}.";
var variableMap =
{
Имя: "Аноним",
Местоимение: 'он',
Месторасположение: 'банк',
БлизкоеМестоположение: 'мой дом',
}
var parsedText = parseVariableString(variableText, variableMap);
// БОЛЬШЕ ЛОГОВ
console.log('variableMap =', variableMap);
console.log('variableText=", variableText);
console.log("parsedText=", parsedText);
ПРИМЕЧАНИЕ что было бы полезно добавить как можно больше пунктуации в следующую шаблон:
const variablePattern = /"([\w\d\s,.;!?\\\-+*=/_\[\]\(\)\{\}@#$%&]*)'/g;
ВАЖНО: parseVariableString
может использовать как массив, так и объект в качестве параметра theKeyValuePairs
.
PS.1: Я сделал заполнитель как ${<ПЕРЕМЕННАЯ>}
, где <ПЕРЕМЕННАЯ>
это ваш ключ для упрощения генерации javascript динамически.
PS.2: Сгенерированные переменные строки будут работать только с числовыми ключами. Но вы можете распарсить их, используя массив и заменяя заполняющие элементы новыми именованными заполняющими элементами.
Вы можете пройтись по одному из массивов слов, проверяя, совпадает ли каждое слово с текущим словом в другом массиве, и отслеживая те, которые не совпадают.
Обратите внимание, если ваш запрос не совпадает с вашим под, это может привести к сбою/бесконечному циклу/разрыву, если не предпринять надлежащие шаги по обеспечению защиты.
const sub = "Сгенерируйте что-то в формате 1:1 для в настроении. Изображение должно быть создано в стиле. Текст находится сверху. Внизу надпись:. Графические элементы должны визуально отражать термины."
const prompt = "Сгенерируйте что-то в формате 1:1 для 'День Рождения' в 'веселом, праздничном' настроении. Изображение должно быть создано в 'Граффити' стиле. Текст 'С Днем Рождения!' находится сверху. Внизу надпись: 'Лиам'. Графические элементы должны визуально отражать термины 'звезды, шарики'.";
const re = /[\.\s]+/;
const sa = sub.split(re);
const pa = prompt.split(re);
const output = [];
for (let si = 0, pi = 0; si < sa.length; si++) {
const part = [];
while (sa[si] != pa[pi]) {
part.push(pa[pi]);
pi++;
}
if (part.length) output.push(part.join(" "));
pi++;
}
console.log(output);
Вам просто нужно использовать несколько регулярных выражений, если вы новичок, вы можете попросить ИИ сделать это за вас.
Вот:
- Мы используем
(.+?)
, где.+
вместе сопоставляет один или более чем один знак в последовательности, пока не появится соответствующий шаблон,?
делает сопоставление менее жадным, т.е. оно будет совпадать с наименьшим возможным количеством, пока не вернётся к пути. .match(regex)
возвращает соответствующие совпадения, из которых мы извлекаем содержимое по порядку
const responseText = "Сгенерируйте что-то в формате 1:1 для День Рождения в 'веселом, праздничном' настроении. Изображение должно быть создано в 'Граффити' стиле. Текст 'С Днем Рождения!' находится сверху. Внизу надпись: 'Лиам'. Графические элементы должны визуально отражать термины 'звезды, шарики.'; // или используйте ввод
const sub = "Сгенерируйте что-то в формате 1:1 для в настроении. Изображение должно быть создано в стиле. Текст находится сверху. Внизу надпись:. Графические элементы должны визуально отражать термины."; // Шаблонная строка
// Вы можете расширить это до полного совпадения, хотя это не обязательно, как совпадение здесь происходит только в необходимом предложении, а не с начала абзаца
const regex = /for (.+?) in an (.+?) mood\. The image should be created in an (.+?) style\. The text (.+?) is at the top\. At the bottom is the lettering: (.+?)\. Graphic elements should visually reflect the terms (.+?)\./;
const matches = responseText.match(regex);
if (matches) {
const [fullMatch, occasion, mood, style, textTop, textBottom, terms] = matches;
console.log({
occasion,
mood,
style,
textTop,
textBottom,
terms
});
}
.
Ответ или решение
Извлечение значений из строки с использованием регулярных выражений в JavaScript
В данном руководстве мы рассмотрим эффективные методы извлечения значений из строки, основываясь на предоставленном примере текста. Эти методы будут полезны для предзаполнения определенных полей ввода и могут быть адаптированы под различные языки и форматы текста.
Техническое описание задачи
Мы получаем текст с метками, где определенные слова или фразы заключены в теги <code>
или обрамлены кавычками. Наша цель — извлечь эти значения из текста, используя регулярные выражения.
Для начала, представим массив подстрок, которые должны быть извлечены из общего текста:
const responseText = "Generate something in 1:1 format for Birthday in an cheerful, celebratory mood. The image should be created in an Graffiti style. The text Happy Birthday! is at the top. At the bottom is the lettering: Liam. Graphic elements should visually reflect the terms stars, balloons.";
const sub = "Generate something in 1:1 format for in an mood. The image should be created in an style. The text is at the top. At the bottom is the lettering:. Graphic elements should visually reflect the terms.";
Здесь responseText
содержит слова, которые нам нужны, такие как Birthday
, Liam
, stars, balloons
, которые не присутствуют в строке sub
.
Решение
Основная идея заключается в использовании регулярных выражений для извлечения нужных нам значений. Для этого мы можем воспользоваться методом String.match()
. Рассмотрим пример:
const regex = /for (.+?) in an (.+?) mood\. The image should be created in an (.+?) style\. The text (.+?) is at the top\. At the bottom is the lettering: (.+?)\. Graphic elements should visually reflect the terms (.+?)\./;
const matches = responseText.match(regex);
if (matches) {
const [fullMatch, occasion, mood, style, textTop, textBottom, terms] = matches;
console.log({
occasion, // Событие (например, "Birthday")
mood, // Настроение (например, "cheerful, celebratory")
style, // Стиль (например, "Graffiti")
textTop, // Верхний текст (например, "Happy Birthday!")
textBottom, // Нижний текст (например, "Liam")
terms // Графические элементы (например, "stars, balloons")
});
}
Подробное объяснение кода
-
Регулярное выражение: Шаблон, используемый в
regex
, элегантно захватывает нужные слова и фразы, отделяя их от общего текста. -
Метод
match()
: Мы применяем это регулярное выражение к нашейresponseText
, что возвращает массив значений. Первое значение — это полное совпадение текста, а остальные — извлеченные подстроки. -
Проверка на наличие совпадений: Извлеченные значения присваиваются переменным для удобства дальнейшего использования.
Универсальность
Данный подход можно легко адаптировать к различным языкам и формулировкам, изменяя текст регулярного выражения. Благодаря этому, можно извлекать значения не только из английского, но и из текста на других языках, просто изменив соответствующие строки.
В итоге, использование регулярных выражений в JavaScript — мощный инструмент, позволяющий выполнять сложные задачи по обработке строк быстро и эффективно. Этот метод предоставляет надежный способ извлечения информации для дальнейшего использования, что особенно полезно в разработке интерфейсов и автоматизации форм ввода.