在C ++中匹配正则表达式的惯用法

时间:2013-11-15 10:21:46

标签: c++ regex string

我想比较C ++中的两个字符串:

  1. 有一个函数getName()返回一个字符串。
  2. 现在我可以写Out << getName();这将打印字符串。
  3. 但是我想打印字符串 ,如果其值为arpitarpit*N*,其中 N 是一个整数。我想要打印它,如果它的值为arpitaarpitx,其中 N 不是整数或空字符串。
  4. 我知道这可以轻松完成,但我希望在最少的行数中完成此操作。

    到目前为止,我所做的是:

    char name1[] = getName();
    char name2[] = "arpit";
    for (int x = 0; x <= 4; x++){
        if (name1[x] == name2[x]) continue;
        else return ( Out << "not equal") ;
        }
    while(name1[x] ! = "\0"){
        if(isdigit(name1[x])
        x++;
        else return (Out << "not equal") ;
        }
    Out << getName();
    

    更新1 getName()返回一个字符串,直到遇到空格,并且不会返回任何行或2个或更多单词。

3 个答案:

答案 0 :(得分:2)

如果你有C ++ 11:

static std::regex const matcher( "arpit\\d*" );

if ( regex_match( name, matcher ) ) {
    //  matches...
}

如果您没有C ++ 11,则boost :: regex几乎完全相同。

如果您没有C ++ 11,则无法使用boost:

if ( name1.size() >= name2.size()
    && std::equal( name2.begin(), name2.end(), name1.begin() )
    && std::find_if( name1.begin() + name2.size(),
                     name1.end(),
                     []( unsigned char ch ) { return !isdigit( ch ); }
                    ) == name1.end() )
    //  matches...
}

对于其他人,您的代码有很多错误,不应该 编译。特别是,{em>没有 getName() 可以返回可用于初始化char []的内容;该 C ++中字符串的类型是std::string,以及您的变量 应该是:

std::string name1( getName() );
std::string name2( "arpit" );

(除了你需要更好的名字。第二个可能是 例如referenceheader之类的内容。)

当然,用isdigit调用它是未定义的行为 一个char;您必须先转换为unsigned char

答案 1 :(得分:1)

auto s = getName();
if(s.size() >= 5 && s.substr(0,5) == "arpit")
    Out << s;

答案 2 :(得分:0)

std::set<std::string> m_allowed_strings;

std::string validate_string(const string & s)
{
    if(m_allowed_strings.find(s) != m_allowed_strings.end())
            return s;
    return "";
}

cout << validate_string(getName());