使用正则表达式验证字符串不是以特定字符和字符串长度开头

时间:2016-07-11 02:01:28

标签: regex string c++11

我有一个带有以下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

我是否错过了一些微不足道的事情,或者使用正则表达式这是不可能的?看起来应该是这样。

随意提出一个更好的标题,我试图尽可能具有描述性。

2 个答案:

答案 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)

将正则表达式更改为:"^(?![\\s.])([A-Za-z]{10,46}$)",它会起作用。

\s指的是任何空格,您需要转义字符串中的\,这就是\\s的原因。

您还可以查看此link