“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==')

Posted

技术标签:

【中文标题】“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 \'==\')【英文标题】:C++ string of "1" does not match "1" (tried regex and boolean '==')“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==') 【发布时间】:2015-10-31 01:01:37 【问题描述】:

查看 gif(Visual Studio 调试器显示变量): http://www.elanhickler.com/transfer/regex_does_not_match.gif

bool stob(string s) 
    regex e("1");
    bool b1 = (s == "1"); // false
    bool b2 = (string(s) == "1"); // false
    bool does_it_match1 = regex_match("1", e); // true
    bool does_it_match2 = regex_match(string(s), e); // false
    bool does_it_match3 = regex_match(string("1"), e); // true
    return does_it_match1;

为什么不匹配?

图片显示 s 的输入是“1”,更具体地说是 49("1")0("\0") 的字符

ideone:https://ideone.com/b8luZF(这说明了问题,感谢下面的答案解决了)。

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

int main() 
    regex e("1");
    string s = "1,";
    s.back() = '\0';

    cout << regex_match("1", e) << endl;
    cout << regex_match(s, e) << endl;

    return 0;

【问题讨论】:

尝试打印出带有引号的字符串s,例如std::cout &lt;&lt; "s = \"" &lt;&lt; s &lt;&lt; "\"\n"; 这样您就可以很容易地看到它是什么,以及它是否包含任何前导/尾随空格。 刚刚添加了一张图片。它可能是空终止吗? 您的结果与s 一致,实际上并不包含1。为了改进您的问题,请发布一个包含传递给函数的值的 MCVE。 好吧,调试器确实说s 的大小是两个字符。除非您手动将大小设置为 2,否则不应这样做。不,大小不应该包括终止符。你能告诉我们你是如何初始化s的吗?你如何调用函数?您能不能尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示? @Joachim Pileborg 正在研究它 【参考方案1】:

与 C 字符串不同,C 字符串从指针指向的位置开始并在第一个 0 字节之前结束,std::strings 实际上可以包含 0 字节。您的字符串似乎正是这种情况。根据您的调试器,该字符串包含两个字符,第一个是'1',第二个是'\0'。

因此,您将 2 个字符的字符串与 1 个字符的字符串进行比较,因此结果为 false。

【讨论】:

当你说 string a="1" 时,它还是把它作为 1\0 保存在内存中? @GRC:不。(实际上每个实现细节都是肯定的,但这在这里无关紧要。)​​​​​​所以调试器表明这不是什么是OP正在提供功能。我们要求他们提供适当测试用例的另一个原因。很明显,当他们是不理解问题的人时,“我只相信我传递给函数的东西,因此你也必须如此”是不够的! 我刚刚做了if (s.back() == '\0') s.pop_back();,它解决了问题……但这危险吗? @ElanHickler:这不是“危险的”,但它表明调用范围中的错误/错误/问题,您应该从源头修复。 我想我找到了问题所在。在另一个函数中,我正在做descriptions.back() = '\0'; values.back() = '\0'; 换句话说,我正在向一个字符串添加一个空终止,该字符串最终会找到我的 stob 函数。我这样做是为了解决另一个问题。我想我需要用不同的方式解决它。

以上是关于“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==')的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 C++ 中使用 boost 正则表达式匹配从字符串转换为 int 时出错

面试题19:正则表达式匹配(C++)

python的正则表达式

C ++正则表达式替换第一个匹配项

正则表达式与新行之间的内容不匹配 (\r\n)

c++标准库中没有关于正则匹配字符串的函数么