我运行了这个简单的程序:
#include <iostream>
#include <string>
using namespace std;
#include <boost/regex.hpp>
int main ()
{
// boost::regex fullname_regex ("[A–Z]+[a–z]*, [A-Z][a–z]*");
boost::regex fullname_regex ("[A-Z]+[a-z]*, [A-Z][a-z]*");
string name;
cout << "Enter you full name: " << flush;
getline (cin, name);
if (! regex_match (name, fullname_regex))
{
cout << "Error: name not entered correctly" << endl;
}
return 0;
}
我刚从某处复制过的。当我取消注释注释行(原始复制/粘贴的一部分)并注释下一个(由我自己键入)时,程序始终拒绝该名称。否则它按预期工作。我正在使用vim。我做了:set list
看到隐藏的字符并且线条相同。我在原始行之前插入一个长注释,以便将其向下移动,怀疑磁盘故障(非常旧的系统),但我仍然得到了同样的错误。这是一个没有gui的ubuntu服务器,我用putty来做这个。我不习惯linux下的这类问题,如果有人知道什么可以解释这种奇怪的行为,请告诉我。也许vim仍然使用原始页面中的一些选项,here并且格式化了,但:set list
没有显示它们?
答案 0 :(得分:6)
破折号不一样。评论的那些更长并且由不同的字符表示,因此被不同地解释。常见复制+粘贴错误。
答案 1 :(得分:3)
注释掉的行中的-
字符是U + 2013 EN DASH ,而不是ASCII短划线U + 002d。
由于我使用的位图字体有限,打开文件时Unicode字符已经突出,但您可以使用g8
命令打印光标下字符的UTF-8编码值,或使用:call search('[^\x00-\x7F]')
找到下一个非ASCII字符。
答案 2 :(得分:1)
当我在我的文本编辑器中粘贴代码时,我立即看到注释行中的第一个[A-Z]实际上是使用长划线。
你想要一个简单的短划线,这就是你输入的内容。
答案 3 :(得分:1)
您似乎对:set list
的目的感到困惑。它的设计通常不会显示“怪异”字符:只有非常小的一组(制表符,不间断空格,尾随空格......),详见:help 'list'
。
set list
在这种情况下无济于事。
set list
处理常规空间变为不间断空格,但是当从网络或PDF或邮件客户端和文本处理器进行复制粘贴时,您应该担心其他特殊字符:{{ 1}}经常被"
取代,”
取代'
等等......有一天,我有一个长段,其中’
或'
用’
替换的地方。在这种情况下很容易发现,但在其他情况下可能很容易错过。