qstring استبدال فقط الحدوث
سؤال
هل هناك طريقة بسيطة لاستبدال الحدوث الأول فقط لبعض السلاحيات الفرعية الأخرى في QString؟يمكن أن يكون في أي موقف.
المحلول
يمكنك تجربة هذا:
giveacodicetagpre.ستكون السلسلة الناتجة:
هذه هي السلسلة
نصائح أخرى
لا توجد طريقة راحة للعملية التي ترغب في الحصول عليها. ومع ذلك، يمكنك استخدام الطرق التالية التالية لبناء العملية المخصصة الخاصة بك:
إرجاع موضع الفهرس من الحدوث الأول ل String Str في هذه السلسلة، والبحث إلى الأمام من موضع الفهرس من. إرجاع -1 إذا لم يتم العثور على شارع.
إذا كانت CS هي QT :: CaseSenditive (افتراضي)، فإن البحث حساس لحالة الأحرف؛ وإلا فإن البحث غير حساس للحالة.
و
qstring & qstring :: استبدال (الوظيفة الدولية، INT N، const qstring و بعد)
يستبدلالأحرف N بدءا من موضع الفهرس مع السلسلة بعد وإرجاع مرجع إلى هذه السلسلة.
ملاحظة: إذا كان مؤشر الموضع المحدد ضمن السلسلة، ولكن ينتقل الموضع + N إلى خارج نطاق السلاسل، فسيتم ضبط N يتم ضبطه للتوقف في نهاية السلسلة.
الآن، وضع كل ذلك موضع التنفيذ، يمكنك كتابة شيء كما يلي:
main.cpp
giveacodicetagpre.main.pro
giveacodicetagpre.بناء وتشغيل
giveacodicetagpre.الإخراج
giveacodicetagpre.This is pretty much the way QString::replace(QRegularExpression, ... does it. Since it's possible that literal backslashes could be part of replace pattern, those need to be captured differently. Note that actual replacement happens right-to-left to preserve leftward offset validity. It's possible to put this more compactly, but easier to debug in this form.
QRegularExpression regex = QRegularExpression(regex_pattern);
if (regex.isValid() and
(regex_pattern.length() > 0)) {
QRegularExpressionMatchIterator regex_iterator =
regex.globalMatch(target_text, Apply_Target_Offset,
QRegularExpression::PartialPreferCompleteMatch);
if (regex_iterator.hasNext()) {
// At least one found
QRegularExpressionMatch match = regex_iterator.next();
if (match.hasMatch() and (not match.hasPartialMatch())) {
// This is the first match, and it's complete
int match_begin = match.capturedStart();
int match_end = match.capturedEnd();
int match_length = match.capturedLength();
QStringList captured;
const int capture_groups_count = regex.captureCount() + 1;
for (int capture_group_idx = 0; capture_group_idx < capture_groups_count; ++capture_group_idx) {
captured.append(match.captured(capture_group_idx));
}
QString replace_pattern = Apply_Replace_Pattern->toPlainText();
QString replace_text = replace_pattern;
QList<QRegularExpressionMatch> replace_pattern_match_list;
QRegularExpression replace_pattern_regex = QRegularExpression("(?:\\\\\\\\)+|(?:\\\\(\\d+))");
if (replace_pattern_regex.isValid()) {
QRegularExpressionMatchIterator replace_pattern_regex_iterator =
replace_pattern_regex.globalMatch(replace_pattern);
while (replace_pattern_regex_iterator.hasNext()) {
QRegularExpressionMatch replace_pattern_match = replace_pattern_regex_iterator.next();
bool no_error;
replace_pattern_match.captured().right(1).toInt(&no_error);
// Only accept backreferences w/ numbers
if (no_error) replace_pattern_match_list.append(replace_pattern_match);
}
while (replace_pattern_match_list.count() > 0) {
QRegularExpressionMatch replace_pattern_match = replace_pattern_match_list.takeLast();
int cap_idx = replace_pattern_match.captured(1).toInt();
if (cap_idx < captured.count()) {
replace_text.replace(replace_pattern_match.capturedStart(),
(replace_pattern_match.capturedEnd() -
replace_pattern_match.capturedStart()),
captured[cap_idx]);
}
}
// Render '\' characters properly
replace_text.replace("\\\\", "\\");
}
target_text.replace(match_begin, (match_end - match_begin), replace_text);
}
}
}
//------------------------------------------------------------------
QString & replace_first(QString &io_haystack, const QString & sub_str, const QString & new_str)
{
io_haystack.replace(io_haystack.indexOf(sub_str), sub_str.size(), new_str);
return io_haystack;
} // replace_first
//------------------------------------------------------------------
QString & replace_first(QString &io_haystack, const QRegularExpression & sub_regx, const QString & new_str)
{
QRegularExpressionMatch match;
match = sub_regx.match(io_haystack);
if (match.hasMatch()) {
QString sub_str = match.captured(0);
io_haystack.replace(io_haystack.indexOf(sub_str), sub_str.size(), new_str);
}
return io_haystack;
} // replace_first