C ++ قمزة السلسلة باستخدام تعبير منتظم
سؤال
أحاول أن أتعلم نفسي بعض C ++ من الصفر في الوقت الحالي.
أنا على دراية جيدة في بيثون، بيرل، جافا سكريبت ولكن لم أواجه فقط C ++ لفترة وجيزة، في إعداد الفصول الدراسية في الماضي. يرجى إسماء سذاجة سؤالي.
أرغب في تقسيم سلسلة باستخدام تعبير منتظم ولكن لم يكن لديه حظا كبيرا في العثور على مثال واضح ونهائي وكفء وكامل حول كيفية القيام بذلك في C ++.
في بيرل، هذا أمر شائع، وبالتالي يمكن إنجازها بطريقة تافهة،
/home/me$ cat test.txt
this is aXstringYwith, some problems
and anotherXY line with similar issues
/home/me$ cat test.txt | perl -e'
> while(<>){
> my @toks = split(/[\sXY,]+/);
> print join(" ",@toks)."\n";
> }'
this is a string with some problems
and another line with similar issues
أود أن أعرف أفضل طريقة لإنجاز ما يعادلها في C ++.
تعديل:
أعتقد أنني وجدت ما كنت أبحث عنه في مكتبة دفعة، كما ذكر أدناه.
دفعة Regex-Token-Imerator (لماذا لا تؤكد العمل؟)
أعتقد أنني لم أكن أعرف ما هو البحث عنه.
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
int main(int argc)
{
string s;
do{
if(argc == 1)
{
cout << "Enter text to split (or \"quit\" to exit): ";
getline(cin, s);
if(s == "quit") break;
}
else
s = "This is a string of tokens";
boost::regex re("\\s+");
boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
boost::sregex_token_iterator j;
unsigned count = 0;
while(i != j)
{
cout << *i++ << endl;
count++;
}
cout << "There were " << count << " tokens found." << endl;
}while(argc == 1);
return 0;
}
المحلول
عادة ما تكون مكتبات الرزهة عادة اختيار جيد، في هذه الحالة boost.regex.. وبعد هناك حتى مثال لتقسيم سلسلة إلى الرموز التي تفعل بالفعل ما تريد. في الأساس يأتي إلى شيء مثل هذا:
boost::regex re("[\\sXY]+");
std::string s;
while (std::getline(std::cin, s)) {
boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
boost::sregex_token_iterator j;
while (i != j) {
std::cout << *i++ << " ";
}
std::cout << std::endl;
}
نصائح أخرى
إذا كنت ترغب في تقليل استخدام ITERATONTORS، فقم بإعداد التعليمات البرمجية الخاصة بك، يجب أن تعمل ما يلي:
#include <string>
#include <iostream>
#include <boost/regex.hpp>
int main()
{
const boost::regex re("[\\sXY,]+");
for (std::string s; std::getline(std::cin, s); )
{
std::cout << regex_replace(s, re, " ") << std::endl;
}
}
على عكس perl، لا تعبر التعبيرات العادية "في" في C ++.
تحتاج إلى استخدام مكتبة خارجية، مثل بات.
Regex هي جزء من TR1 المضمنة في Visual C ++ 2008 SP1 (بما في ذلك EXPRESS EDITION) و G ++ 4.3.
الرأس هو <regex>
واسم الاسم STD :: TR1. يعمل بشكل رائع مع STL.