Visual Studio 2003 使用正则表达式的替代方法
Alternative way of using regex for Visual Studio 2003
我构建了一个示例程序来使用正则表达式检查值。此示例是 运行 于 Visual Studio 2012。
但是正则表达式在 Visual Studio 2003 年不存在。
我的问题是:如何在不使用正则表达式和第 3 方库的情况下使用 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 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 == '}';
}
我构建了一个示例程序来使用正则表达式检查值。此示例是 运行 于 Visual Studio 2012。
但是正则表达式在 Visual Studio 2003 年不存在。
我的问题是:如何在不使用正则表达式和第 3 方库的情况下使用 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 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 == '}';
}