Allow using regex capture groups in replacement

This commit is contained in:
Przemek Pawlas
2024-09-28 15:32:26 +02:00
committed by WarmUpTill
parent c2d2e883c6
commit 0e9875e6b5
2 changed files with 7 additions and 10 deletions

View File

@@ -1078,6 +1078,7 @@ AdvSceneSwitcher.action.variable.askForValuePrompt="Assign value to variable:"
AdvSceneSwitcher.action.variable.mathExpression.example="( 1 + 2 * 3 ) / 4"
AdvSceneSwitcher.action.variable.findAndReplace.find="Text to find"
AdvSceneSwitcher.action.variable.findAndReplace.replace="Text to replace with"
AdvSceneSwitcher.action.variable.findAndReplace.replace.tooltip="Using \1, \2, etc. to represent first, second, etc. capture groups is supported."
AdvSceneSwitcher.action.variable.subString.begin="Beginning"
AdvSceneSwitcher.action.variable.subString.all="All"
AdvSceneSwitcher.action.variable.invalidSelection="Invalid selection!"

View File

@@ -150,18 +150,12 @@ void MacroActionVariable::HandleFindAndReplace(Variable *var)
var->SetValue(value);
return;
}
QString resultString = QString::fromStdString(value);
QString replacement = QString::fromStdString(_replaceStr);
auto regex = _findRegex.GetRegularExpression(_findStr);
auto matchIterator = regex.globalMatch(QString::fromStdString(value));
int offset = 0;
while (matchIterator.hasNext()) {
QRegularExpressionMatch match = matchIterator.next();
resultString.replace(match.capturedStart() + offset,
match.capturedLength(), replacement);
offset += replacement.length() - match.capturedLength();
}
var->SetValue(resultString.toStdString());
auto result = QString::fromStdString(value);
result = result.replace(regex, replacement);
var->SetValue(result.toStdString());
}
void MacroActionVariable::HandleMathExpression(Variable *var)
@@ -739,6 +733,8 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_regexMatchIdx->setMinimum(1);
_regexMatchIdx->setMaximum(999);
_regexMatchIdx->setSuffix(".");
_replaceStr->setToolTip(obs_module_text(
"AdvSceneSwitcher.action.variable.findAndReplace.replace.tooltip"));
_inputPrompt->setSizePolicy(QSizePolicy::MinimumExpanding,
QSizePolicy::Preferred);
_sceneItemIndex->setMinimum(1);