关键词:
【中文标题】“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 << "s = \"" << s << "\"\n";
这样您就可以很容易地看到它是什么,以及它是否包含任何前导/尾随空格。
刚刚添加了一张图片。它可能是空终止吗?
您的结果与s
一致,实际上并不包含1
。为了改进您的问题,请发布一个包含传递给函数的值的 MCVE。
好吧,调试器确实说s
的大小是两个字符。除非您手动将大小设置为 2,否则不应这样做。不,大小不应该包括终止符。你能告诉我们你是如何初始化s
的吗?你如何调用函数?您能不能尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示?
@Joachim Pileborg 正在研究它
【参考方案1】:
与 C 字符串不同,C 字符串从指针指向的位置开始并在第一个 0 字节之前结束,std::string
s 实际上可以包含 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 函数。我这样做是为了解决另一个问题。我想我需要用不同的方式解决它。正则regexp
...邮箱的格式符不符合) 正则就是一条规则,用于检验字符串的格式,目标就是字符串; 只要是通过表单提交的数据,都是字符串 正则的定义: 1.varreg=newRegExp() 2.varreg=/格式/ (正则的简写,建议) 正则... 查看详情
算法题:判断正则表达式的.和*的模式匹配(代码片段)
...字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路描述1、字符串和匹配模式都为空,返回true;否则递归,进入2... 查看详情
正则表达式分组与 C++ 11 正则表达式库匹配
...:我正在尝试使用正则表达式进行组匹配。我想从一个大字符串中提取两个字符串。输入字符串如下所示:tХB:Username!Username@Username.tcc.domain.comConnectedtХB:Username!Usern 查看详情
python正则表达式怎么匹配
...正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则... 查看详情
剑指offer(c++)-jz19:正则表达式匹配(算法-动态规划)(代码片段)
...现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配数据范围:1.str只包含从 a-z ... 查看详情
正则regexp
1.正则就是一条规则,用于检验字符串的格式,目标就是字符串。只要要是表单提交的数据都是字符串2.正则定义 1.varreg=newRegExp(); 2.varreeg=/格式/;3.正则的方法 就两大功能,一个是匹配,匹配成功就是true,... 查看详情
正则表达式 - 如何告诉不匹配的东西? [复制]
...不匹配的正则表达式?例如,我想用正则表达式匹配不是字符串“www.petroules.com”的所有内容。我尝试了[^www\\.petroules\\.com],但这似乎不起作用。【问题讨论】:【参考方案1】:^ 查看详情
正则表达式——初次尝试
...正则表达式?**1、正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串 替换,或者 查看详情
5-1
re.search方法re.search扫描整个字符串并返回第一个成功的匹配。re.match与re.search的区别re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。检... 查看详情
面试题19:正则表达式匹配(c++)(代码片段)
...的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。题目示例示例1:输入:s="aa"p="a"输出:false解释:"a"无法匹配"aa"整个字符... 查看详情
正则表达式基础用法整理(代码片段)
...表达式介绍1.1.1什么是正则表达式?正则表达式就是一种字符串,该字符串通过包含特殊的符号,来描述一类字符串的公共特点,进而可以使用该模式串来匹配并获取文本内容中的所有符合该特点的字符串,也可以使用该模式来... 查看详情
正则表达式(1.语法)
...正则表达式描述了一种规则,通过这个规则可以匹配一类字符串2.测试正则的工具:RegexBuddy3.正则表达式的语法: 1.普通字符:字母,数字,下划线,以及没有特殊定义的标点符号,都是普通字符。表达式中的普通字符,在... 查看详情
5.2.1正则表达式语法与子模式扩展语法
...同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成复杂的字符串处理任务。常用的正则表达式元字符如下表所示:元字符功能说明.匹单个字符配除换行符以外的任意*匹配*之前的字符或子模式的0次或多次... 查看详情
pythonre模块与正则表达式详解(代码片段)
...题;我们先来看一个问题,切入正则表达式。问题:匹配字符串,最少以3个数字开头。使用Python代码如何实现?检查条件:1>字符串长度判断;2>判断前三个字符是否是数字;这样实现起来有点啰嗦,我们可以使用正则表达... 查看详情
[剑指offer]52.正则表达式匹配(代码片段)
...字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配思路:当匹配模式的i+1位不是"*"时: 直接判断str[i]和str[i+1]是... 查看详情
python正则匹配^和$使用问题
...是用search的机制。因为它是findall所以,就不可能用^作为字符串开头。因为字符串只有一个开头,但是有很多的”电话号码“。同样一个字符串也只有一个结尾。你如果有结尾也不合适。追问因为在匹配时有一些不正确的数字会... 查看详情
正则表达式
...端第一个字符开始,左到右依次一个一个字符进行匹配.当字符串中有字符成功匹配到正则表达式中字符,则从这个位置开始尝试正则表达式中的下一个字符进行匹配,如果匹配成功则继续从这个位置开始匹配正则表达式中下一个字... 查看详情
perl学习模式匹配与正则表达式
一:模式匹配中的特殊字符1: 点号. 匹配任何单个字符(换行符\n除外)2: 反斜线\ 转义字符,用于特殊符号前,使其失去特殊字符的作用变成普通字符3: + 匹配该字符前面的字符(单个)... 查看详情