【问题标题】:Alternative way of using regex for Visual Studio 2003为 Visual Studio 2003 使用正则表达式的替代方法
【发布时间】:2016-09-03 09:58:40
【问题描述】:

我构建了一个示例程序来使用正则表达式检查值。此示例在 Visual Studio 2012 上运行。

但在 Visual Studio 2003 上不存在 Regex。

我的问题是:如何在不使用 Regex 和 3rd 方库的情况下使用 Visual Studio 2003 检查值?

我的源代码:

#include "stdafx.h"
#include <regex>
#include <string>
using namespace std;


int main()
{
    std::string code1 = "{1N851111-8M32-2234-B83K-123456789012}";
    std::regex control("^[{]{8}[A-Za-z0-9]{1}[-]{4}[A-Za-z0-9]{1}[-]{4}[A-Za-z0-9]{1}[-]{4}[A-Za-z0-9]{1}[-]{12}[A-Za-z0-9]$[}]");
    std::smatch match;

    if (std::regex_search(code1, match, control))
    {
        std::cout << "MAtch found";

    }

    else
    {
        std::cout << "Match not found";
    }

    return 0;
}

【问题讨论】:

  • std::regex 从 C++11 开始出现,因此预计在 VC2003 中它们会丢失。
  • 您也可以使用 3rd-party 库,例如 PCRE 来解决您的任务。查看this blog post 了解详情。
  • @ForceBru 可能,他的意思是“检查”——对于以德语为母语的人(如果他是)来说,这是一个典型的错误,其中“kontrollieren”可能意味着检查和控制......
  • @Skydreampower,编写你自己的正则表达式引擎:P 或者只是使用一些if 语句:检查字符串中是否有足够的字符,它们是否由有效字母组成,检查每组等后面是否有-
  • 这可能会更好地被问到,“如何在没有正则表达式的情况下检查字符串是否是有效的 UUID?”

标签: c++ regex visual-studio-2003


【解决方案1】:

好吧,如果您不想使用第三方库(为什么,顺便说一下?),您将不得不一路步行......(听起来很容易,不是吗?)

起初,您的正则表达式似乎不是您所追求的。你试过了吗?这至少与您的示例字符串匹配:

std::regex control("^[{][A-Za-z0-9]{8}([-][A-Za-z0-9]{4}){3}[-][A-Za-z0-9]{12}[}]$");

那我们来看看正则表达式(我要用我的……):

^ – 很好,从头开始,所以我们不必在字符串中间的某个位置搜索...
[{] – 必须是左大括号
[A-Za-z0-9]{8} –后跟正好八个字母数字字符
([-][A-Za-z0-9]{4}){3} – 一个减号后跟字母数字 – 整个内容三遍
[-][A-Za-z0-9]{12} – 另一个减号后跟 telve 字母数字
[}]$ – 右大括号结束

所以:

bool isValid(::std::string const& value)
{
    if(value.length() != 38)
        return false;
    char const* v = value.c_str();
    if(*v++ != '{')
        return false;
    for(char const* end = v + 8; v != end; ++v)
    {
        if(!isalnum(*v))
            return false;
    }
    for(int i = 0; i < 3; ++i)
    {
        if(*v++ != '-')
            return false;
        for(char const* end = v + 4; v != end; ++v)
        {
            if(!isalnum(*v))
                return false;
        }
    }
    if(*v++ != '-')
        return false;
    for(char const* end = v + 12; v != end; ++v)
    {
        if(!isalnum(*v))
            return false;
    }
    return *v == '}';
}

【讨论】:

  • 感谢您提供替代解决方案。我从小就用正则表达式来检查一个值。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 2011-12-21
  • 2011-11-29
  • 2019-01-17
  • 2019-04-06
  • 2017-09-20
相关资源
最近更新 更多