3

boost::regex文字列内の文字のマッチング\rと文字に関して、動作に問題が\nあります。Linux C++ アプリケーションからシリアル ポート経由でモデムと通信していますが、次のメッセージが表示されます。

ATI3\r\nv3.244\r\nOK\r\n

返された各文字の ASCII 16 進値を実際にチェックするので、この文字列が正しいことはわかっています。vX.XYZ問題は、アプリケーションが文字列の一部で指定されたバージョン番号を削除する必要があることです。この目的のために、次のboost::regexベースのコードを使用しています。

 string str_modem_fw_version_number = "";
 string str_regex("ATI3\r\nv(\d+[.]\d+)\r\nOK\r\n");
 boost::regex patt;
 try
 {
      patt.assign(str_regex);
      boost::cmatch what;
      if (boost::regex_match(str_reply.c_str(), sc_what, patt)) { 
           str_modem_fw_version_number = string(sc_what[1].first,sc_what[1].second);
      }
 }
 catch (const boost::regex_error& e)
 {
     cout << e.what() << endl;
 }

上記は機能しません - 返された文字列が正しいことはわかりますが、正規表現の CR および NL 文字で明らかなエラーを犯していると確信しています。私はまた、動作しない以下を試しました

 string str_regex("ATI3.*(\d+[.]\d+).*");
 string str_regex("ATI3\\r\\nv(\d+[.]\d+)\\r\\nOK\\r\\n");

boost::regexおよびテーマのバリエーションですが、 が NL および CR 文字をどのように扱うかについての基本的な情報が欠けているに違いないと思います。私はブーストのドキュメントページを見て成功しなかったので、ブーストの代替手段を使用して問題を解決する前に、最後の手段としてここで試しています.

4

1 に答える 1