我有一个带有以下if语句的函数:
if (name.length() < 10 || name.length() > 64)
{
return false;
}
if (name.front() == L'.' || name.front() == L' ')
{
return false;
}
我很想知道是否可以使用以下正则表达式执行此操作:
^(?!\ |\.)([A-Za-z]{10,46}$)
剖析上面的表达式,第一部分^(?!\ |.)
预先形成一个负面的表情,断言字符串不可能以空格或点(。)开头,第二部分应该处理字符串长度条件。我写了以下内容来测试表达式:
std::string randomStrings [] = {" hello",
" hellllloooo",
"\.hello",
".zoidbergvddd",
"asdasdsadadasdasdasdadasdsad"};
std::regex txt_regex("^(?!\ |\.)([A-Za-z]{10,46}$)");
for (const auto& str : randomStrings)
{
std::cout << str << ": " << std::boolalpha << std::regex_match(str, txt_regex) << '\n';
}
我期望最后一个匹配,因为它不以空格或点(。)开头,并且它符合长度标准。但是,这就是我得到的:
hello: false
hellllloooo: false
.hello: false
.zoidbergvddd: false
asdasdsadadasdasdasdadasdsad: false
我是否错过了一些微不足道的事情,或者使用正则表达式这是不可能的?看起来应该是这样。
随意提出一个更好的标题,我试图尽可能具有描述性。
答案 0 :(得分:1)
您需要打开编译器警告。它会告诉你,你的正则表达式中有一个未知的转义序列。我建议使用raw literal。
#include <iostream>
#include <regex>
int main() {
std::string randomStrings[] = { " hello", " hellllloooo", ".hello",
".zoidbergvddd", "asdasdsadadasdasdasdadasdsad" };
std::regex txt_regex(R"foo(^(?!\ |\.)([A-Za-z]{10,46}$))foo");
for (const auto& str : randomStrings) {
std::cout << str << ": " << std::boolalpha
<< std::regex_match(str, txt_regex) << '\n';
}
}
clang ++ - 3.8给出了
你好:假
hellllloooo:false
.hello:false
.zoidbergvddd:false
asdasdsadadasdasdasdadasdsad:true
答案 1 :(得分:1)