1

我正在尝试在 c++ 中使用正则表达式来确定字符串是否仅包含二进制(1/0)。我在java中使用 .matches("[01]+") 非常简单地做到了这一点。但是现在当我尝试转换为 c++ 时,我遇到了问题

我正在使用 Visual Studio 2010 并收到此错误

错误:没有重载函数“regex_match”的实例与参数列表匹配

这是我的代码

#include <iostream>
#include <string>
#include <regex>
using namespace std;

// ...

string bFU;
do
{
    cout << "\nEnter a binary value containing up to 16 digits: ";
    getline (cin, bFU);
    if (!regex_match(bFU, "[01]+") || bFU.length()>16)
    {
        cout << "\nError: Invalid binary value.\nTry again.\n"
                "Press Enter to continue ... ";
        bFU = "a";
        cin.ignore(80, '\n');
    }
} while (!regex_match(bFU, "[01]+"));

在 Visual Studio 中,当我将鼠标悬停在带有红色下划线的 regex_match 上时,我会收到该错误

感谢您的帮助,我一直在谷歌搜索和整理几十个网站,这让问题变得更加模糊

4

3 回答 3

1

regex_match正则表达式采用 astd::basic_regex而不是字符串。

有关可用的重载和使用示例,请参见此处

于 2013-03-12T15:04:04.657 回答
0

如果您检查参考资料,regex_match您会发现您传递的参数与函数实际采用的参数不匹配。

请参阅参考中的示例以了解如何使用该regex_match功能。

于 2013-03-12T15:05:14.647 回答
0

这是我编写程序的方式:

#include <iostream>
#include <string>
#include <regex>
using namespace std;

int main()
{
   const basic_regex<char> binmatcher("[01]+");
   string bFU;
   for (bool matched = false; !matched;)
   {
      cout << "\nEnter a binary value containing up to 16 digits: ";
      getline(cin, bFU);
      matched = regex_match(bFU, binmatcher);
      if (!matched || bFU.length()>16)
      {
         cout << "\nError: Invalid binary value.\nTry again.\n"
            "Press Enter to continue ... ";
         cin.ignore(80, '\n');
      }
   }
   cout << "The binary value I found acceptable was: " << bFU << '\n';
   return 0;
}

不幸的是,我无法真正测试这一点,因为 g++ 4.7.2 中的正则表达式支持被破坏了。

如您所见,regex_match不带字符串。也不应该。编译正则表达式通常比使用正则表达式的计算密集度要高得多。

Perl 非常快,因为它在第一次遇到正则表达式时就编译它们,这是对您隐藏的步骤,并且在某些情况下会导致令人惊讶的结果(例如在运行时生成表达式时)。

::std::regex_match. 在这种情况下,您想要的重载是重载 6,它以 a::std::string和 a::std::basic_regex作为参数。

于 2013-03-12T15:59:26.720 回答