سؤال

أحاول أن أتعلم نفسي بعض 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.

البدء في التعبيرات العادية C ++ TR1

مكتبة مرئية C ++ القياسية: TR1 التعبيرات العادية

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