• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現)

正規表現で文字列のマッチングを行う際に、なぜ一部の箇所しかマッチしないのか?

このQ&Aのポイント
  • C++のプログラムで正規表現を使用して文字列のマッチングを行っています。しかし、特定のパターンに対して、期待通りにマッチングが行われないことがあります。
  • プログラムでは、指定したパターンにマッチする部分の開始位置と終了位置を表示することで、マッチングが正しく行われているかどうかを確認しています。しかし、一部の箇所しかマッチしないことがあり、その原因がわかりません。
  • プログラムのコードを確認したところ、`regcomp`関数でパターンをコンパイルし、`regexec`関数でマッチングを行っています。しかし、どこが問題なのか理解できません。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.3

pmatchに設定されるものを勘違いしてるとこ。 pmatchには検索対象文字列から正規表現にマッチする部分を探し出せるだけ 探して、それを格納するところではないです。 最初にマッチした部分の開始位置・終了位置と グループ指定のマッチした部分の開始位置・終了位置が入ります。 正規表現は"cd"でグループ指定はありませんので pmatchには全体分の1つで正しいです。 "cd"を"(cd)","(c)d","c(d)"など変えてみればわかるかと思います。

sumire_kanou
質問者

お礼

理解ができました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

||

sumire_kanou
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

少なくとも if (regcomp(&preg, (char*)pattern.c_str(), REG_EXTENDED||REG_NEWLINE)) return 1; は変.

sumire_kanou
質問者

補足

ご回答ありがとうございます。申し訳ございませんが、もう少し具体的にご教示頂けると幸いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 警告「代入される前に使われている」を出す方法

    bccで以下のコードをコンパイルすると。 「'i' は、おそらく値が代入される前に使われている」 と警告が出ますが、 「'h' は、おそらく値が代入される前に使われている」 とは警告を出してくれません。 警告を出す方法ってないでしょうか? Hogeメンバに bool 型の初期化フラグでも実装しようかな・・・。 #include <iostream> class Hoge { public: Hoge(){ } Hoge( int i ){ t = i; } operator int(){ return t; } int t; }; int main() { int i; Hoge h; std::cout << i << std::endl; std::cout << h << std::endl; return 0; }

  • Cygwin boost

    Windows XP sp2 + Cygwin の C++ で正規表現を使いたく setup.exe で boost をインストールし、以下のコードをコンパイル($g++ regextest.cpp) したのですがエラーが出てしまいました。 コード: #include <boost/regex.hpp> #include <iostream> using namespace std; int main () { string str("Free Programming For Windows."); boost::regex reg("Free.+Windows\\."); if (boost::regex_match(str, reg)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; } return 0; } エラー: regextest.cpp:1:27: boost/regex.hpp: No such file or directory パスが通っていないようなのですが、どうしたらよいか分かりません。アドバイスいただけたら嬉しいです。 usr/include/boost-1_33_1 に boost/regex.hpp は確認できました。

  • C言語の質問です。

    C言語の質問です。 C言語で、PCの時間を、キーボードで入力した好きな秒数ごとに表示するプログラムを作りたいのですが、どうしても1秒ごとになってしまいます。ここまで作ったのですが、あとどのようにすればよろしいでしょうか? #include <stdio.h> #include <time.h> #include <string.h> int a2i(char x); main() { time_t jikoku; char t[30]; int h,m,s,so=0; int x,a; printf("秒数xを入力"); scanf("%d",&x); while(1){ for(a=0;a<x;a++){ time(&jikoku); strcpy(t,ctime(&jikoku)); h=a2i(t[11])*10+a2i(t[12]); m=a2i(t[14])*10+a2i(t[15]); s=a2i(t[17])*10+a2i(t[18]); if(s!=so+a){ printf("%d:%d:%d\n",h,m,s); so=s; } } } } int a2i(char x) { return(x-'0'); }

  • regexでエラー

    以下のコード(ファイル名:regtest.c)が regtest.c: In function ‘main’: regtest.c:7: error: storage size of ‘reg’ isn’t known というエラーを出力しますが、原因がわかりません。 どなたかご存じの方、よろしくお願いします。 (glibc-2.5-3, gcc4.1.1) #include <sys/types.h> #include <regex.h> int main(void) {   struct re_patter_buffer reg;   return 0; }

  • プログラムの説明

    C++の初心者です。 ↓のプログラムの動作はさっぱりわかりませんが、それについての説明は具体的に教えていただきたいです。(できれば、詳しく) #include <iostream> #include <string> int getNinzu(int ARGC, char *ARGV[]) throw (char const *){ if(ARGC!=2){ throw "Needs only one argument."; } int ninzu=std::atoi(ARGV[1]); if(ninzu<=0){ throw "Value is too small."; } return ninzu; } #include <cstdlib> #include <ctime> int randfive(){ static bool firsttime=true; if(firsttime){ firsttime=false; std::srand(std::time(NULL)); } return static_cast<int>(static_cast<double>(std::rand())/RAND_MAX*(5+1)); } #include <iomanip> int main(int ARGC, char* ARGV[]){ std::string cmdname=ARGV[0]; int ninzu; try{ ninzu=getNinzu(ARGC,ARGV); std::cout << std::setfill('0'); for (int i = 1; i <= ninzu; ++i) { int score = 0; for (int k = 0; k < 20; ++k) score += randfive(); std::cout << "C" << std::setw(5) << i << " " << score << '\n'; } }catch(char const *str){ std::cerr << str << std::endl << "Usage: " << cmdname << " ninzu" << std::endl; return 1; } }

  • 6行ソースをコンパイル可能にしてください

    std::fflush(stdout); という所が間違っているんだと思いますが#include <iostream>は#include <iostream.h>にせずにコンパイルしたいです。 #include <iostream> int main(){ std::cout << "h\n"; std::fflush(stdout); return 0; }

  • なぜかうまく表示されません(原因不明で困ってます)。

    キーを入力するとその入力された文字を表示する、 という単純なプログラムを作成しました。 そこで次のソースを見ていただきたいのですが、 下のこの状態ではうまくいきます。 ところが、余計についているはずの「int t;」を取ると、 表示される文字に余計なものがくっついてきてしまいます。 プログラムをどうみても「t」を使っている箇所はなく、 原因がさっぱりつかめません。 ソースの解読、大変お手数をおかけしますが、 原因を教えていただけないでしょうか。 よろしくお願いいたします。 ---------以下ソース------------- #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { while(1) { char i[40]; int t; i[0]=getch(); if(strcmp(i,"q")==0 || strcmp(i,"Q")==0) break; printf("%s ",i); } return 0; }

  • C++ bcc32環境os windowsVist

    C++ (bcc32環境os windowsVist)でヘッダファイルのコンパイルをしているのですが何回やってもうまくいきません 学校のg++ gcc(Solaris) の環境ではうまくいくのですが 理由はなんでしょう?? 下が.hファイルのソースです #ifndef GUARD_Utilities #define GUARD_Utilities #include <ctime> #include <string> using namespace std; int generate_number(int nMinimum, int nMaximum); string generate_student_id(char cPrefix, int nDigitCount); #endif 参考までにヘッダを利用する?.cppファイルです #include "Utilities.h" int generate_number(int nMinimum, int nMaximum) { return nMinimum + (rand() % nMaximum) + 1; } string generate_student_id(char cPrefix, int nDigitCount) { string szResult(""); szResult += cPrefix; char buffer[2]; for(int i = 0; i < nDigitCount; i++) { int nDigit = generate_number(0, 9); sprintf(buffer, "%d", nDigit); szResult += buffer; } return szResult; }

  • プログラミング言語C++のエラー

    #include <iostream> #include <string> using namespace std; template <typename T> T max(T n1, T n2) { if(n1 > n2) { return n1; } return n2; } int main(){ cout << max<int>(1,2) << endl; cout << max<double>(1.75,3.12) << endl; string s1 = "aiu",s2 = "eo"; cout << max<string>(s1,s2) << endl; return 0; } このコードを入力すると、添付写真のようなエラーが出ます。使用しているのはmacOSのVisual Studio codeです。明らかにいじってはいけない場所のファイル /Library/Developer/CommandLineTools/SDKs/MacOSX14.2.sdk/usr/include/c++/v1/__algorithm/max.h (添付写真のエラー表示下部のパス)が勝手に参照され、引数が一致してしまっているオーバーロードした関数となってしまいます。maxをMaxなどとすると問題は解決するのですが、既存のコードを編集する際、いちいちmaxでエラーが出ると不便です。 ちなみにテンプレートではなく、引数ごとに関数を作ればエラーは出ません。 解決方法を知っている方が居れば教えてほしいです。

  • C++初心者です

    C++初心者です どうも行き詰ってしまったのでまた投稿させていただきました。 文字数が足りないため前回の投稿から何を作ろうとしているか見ていただけると嬉しいです。 http://okwave.jp/qa/q5993632.html どうか間違っているところご指摘お願いできないでしょうか。 最後の部分は根本的にできていないので助けていただけると幸いです #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <map> using namespace std; class Cards { string Name; string Explain; public: Cards(const string e):Explain(e){} const string GetExplain() const {return Explain;} }; class Game { public: static const int KindsOfCards = 4; virtual Cards* SetCard(); }; Cards* Game::SetCard() { switch(rand() % KindsOfCards) { case 1: return new Square; case 2: return new Half; case 3: return new Reverse; case 4: return new Plus; } } class Square : public Cards { public: Square() : Cards("「二乗」 (二乗する)"){} virtual void Excute(); }; class Half : public Cards { public: Half() : Cards("「半分」 (2分の1にする)"){} virtual void Excute(); }; class Reverse : public Cards { public: Reverse() : Cards("「反転」 (符号を反転する)"){} virtual void Excute(); }; class Plus : public Cards { public: Plus() : Cards("「Plus17」", "(17を加える)"){} virtual void Excute(); }; void Square::Excute() { Now[i+1] = Now[i]*Now[i]; return Now[i+1]; } void Half::Excute() { Now[i+1] = Now[i]/2; return Now[i+1]; } void Reverse::Excute() { Now[i+1] = Now[i]*(-1); return Now[i+1]; } void Plus::Excute() { Now[i+1] = Now[i]+(17); return Now[i+1]; } int main() { int Level; Level = 3; srand((unsigned) time(NULL)); map<int,int> Target; for(int i = 0; i <= Level; i++) { Target[i]; } int Now; int T(int t) { public: Cards* c = SetCard(); Target[0](int t0){t0 = rand() % 100;} Target[0] = Now; Target[1](int t1){t1 = c->Excute();} target[2](int t2){t2 = c->Excute();} Target[3](int t3){t3 = c->Excute();} target[3] = t; } cout << "●所有しているカード●" << endl; for(int i = 1; i <= Level; i++) { cout << i << ":" << c->GetExplain() << endl; } cout << "目 標 値:" << T << endl; cout << "現在の数値:" << Now << endl; }