String Tokenizer Class
السلام عليكم ورحمة الله وبركاته ،
عملية الToeknizing هي من أشهر العمليات عند التعامل مع النصوص ، وهي بشكل عام تقسيم النص الى عدة نصوص ويتم فصل ذلك النص حسب العلامة التي تريدها ..
للأسف لا توجد في لغه سي++ القياسية Standard C++ Library أي كلاس أو دالة جاهزة للقيام بذلك بشكل مباشر ( توجد داله في مكتبة لغه السي القياسية C Run-time Library بالإسم strtok تقريبا ولكن كما يوضح الإسم هي تتعامل مع نصوص السي C-Style String وليس string in cpp ) ، كما أن التعامل مع تلك الدالة يحتاج لإستخدام بضعه دوال أخرى في السي للتعامل مع النصوص .
لذلك قمت بكتابة هذا الكلاس وأسميته بنفس الإسم الذي يوجد في الجافا StringTokenizer ،، حاليا يتم ارسال معامل الفصل Delimiter في دالة البناء وفي هذه النسخه الأولى من الكلاس يتم فقط
ارسال معامل واحد وسيتجاهل البقية اذا تم ارسالها .. يمكن بقليل من التعديل التعامل مع أي معامل يتم ارساله .. أترك هذا التعديل لمن هم مهتم بالكلاس ..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | // StringTokenizer.h // Auther: Wajdy Essam #ifndef __STOKEN__ #define __STOKEN__ #include <iostream> #include <vector> using std::string ; using std::vector ; class StringTokenizer { public : StringTokenizer(const string& text , const string& sep=" ") ; int getCount () const ; string elementAt (int index) const ; private: vector<string> elements ; int count ; }; StringTokenizer :: StringTokenizer(const string& text , const string& sep) { count = 0 ; string tmp = "" ; for (unsigned int i=0 ; i<text.length() ; i++) { if ( text[i] == sep[0] ) { elements.push_back(tmp); tmp = "" ; } else { tmp += text[i] ; } } elements.push_back(tmp); count = elements.size(); } int StringTokenizer :: getCount () const { return count ; } string StringTokenizer:: elementAt (int index ) const { return elements[index] ; } #endif // __STOKEN__ |
يمكن للتطوير أيضا اعادة تعريف المعامل [] operator overloading بحيث يكون التعامل مع الكائن أكثر مرونه من استدعاء الدالة elementAt .
برنامج اختبار بسيط :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // String Tokenizer Test // Auther: Wajdy Essam #include <iostream> using namespace std ; #include "StringTokenizer.h" int main (int argc , char* argv[]) { // separate string with space string name = "My name is Wajdy Essam" ; StringTokenizer token(name); for (int i=0 ; i<token.getCount() ; i++) cout << token.elementAt(i) << endl; cout << endl << endl; // separate string with forword slash string path = "C:\\ProgramFiles\\JavaCode" ; StringTokenizer tokenPath(path,"\\"); for (int i=0 ; i<tokenPath.getCount() ; i++) cout << tokenPath.elementAt(i) << endl; cin.get(); return (0); } |
وهذا مخرج برنامج الإختبار السابق :

أرجوا أن يفيد ذلك الكلاس ،،
بالتوفيق ،،
بالمناسبة في جافا الموضوع لا يقتصر على الفواصل العادية
وإنما يمكنك أن تستخدم regex لهذا الموضوع
تحياتي
Hey guys, tried grabbing this blog via Google RSS by putting your feed link into it, but im getting a strange error message, any ideas?
Nevermind, works now!