استبدال العناصر في سلسلة استنادا إلى المسند

StackOverflow https://stackoverflow.com/questions/9400598

  •  29-10-2019
  •  | 
  •  

سؤال

أحتاج إلى استبدال الأحرف في QString بناء على QChar::category.في شروط ستدليب أريد أن

string.erase(std::remove_if(begin(string), end(string), 
                            [](QChar c) { 
                            QChar::Category cat = c.category(); 
                            return cat == .... || cat == ...; }), 
             string.end());

بدلا من ذلك ، أنا سعيد مع التعبير العادي الذي يعمل على حرف يونيكود الفئات التي يمكنني استخدامها ل QString::replace.

هل هذا ممكن مع كسترينغ أو هل أنا حقا بحاجة لتحويل السلسلة في std::vector<QChar> والعودة?

تحرير:الفئات التي أريد احتفظ:

  • لأول تشاراتر:$ ، _ ، أو أي حرف في فئات يونيكود " حرف كبير (لو)" ، " حرف صغير (ليرة لبنانية)" ، " حرف عنوان (لوت)" ، " حرف معدل (لم)" ، "حرف آخر (لو)" ، أو " رقم الحرف (نل)"
  • بالنسبة للباقي:الرمز النقطي الأول بالإضافة إلى أي ش + 200ج صفر عرض أحرف غير النجار ، ش+200د صفر عرض أحرف النجار ، والأحرف في فئات يونيكود "علامة عدم التباعد (المنغنيز)" ، "علامة الجمع بين التباعد (ماك)" ، "رقم الرقم العشري (ند) "، أو"ترقيم الموصل (بيسي)".

يمكنني أن أفعل أولا / الراحة في تمريرات متعددة.

هل كانت مفيدة؟

المحلول

توفر كيو تي طرقها الخاصة للقيام بمثل هذه الأشياء.سواء كان ذلك جيدا, أم لا أمر مشكوك فيه, ولكن كيو تي الاصطلاحية سيكون

QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
    if (is_good(c)) {
        result += c;
    }
}

بالطبع ، يمكنك أن تفعل ذلك مع لامبداس و std::for_each

std::for_each(string.begin(), string.end(),
                  [&result](QChar c)
                    {
                        if (is_good(c)) {result += c; }
                    }
    );

لكنها ليست كذلك Qt اصطلاحي.

لاحظ أن إزالة الرموز من سلسلة أبطأ ، ثم إضافة جديدة ، إذا تم حجز مساحة ، وهذا هو السبب في نموذج التعليمات البرمجية الأولى سريعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top