2016-05-08 3 views
0

Я построил пример программы для проверки значения с помощью регулярного выражения. Этот пример работает на Visual Studio 2012.Альтернативный способ использования regex для Visual Studio 2003

Но Regex не существует на Visual Studio 2003.

Мой вопрос: Как я могу проверить значение с Visual Studio 2003 без использования Regex и Библиотека сторонних организаций?

Мой исходный код:

#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; 
} 
+0

'станд :: regex' появился с C++ 11, поэтому ожидается, что они отсутствуют в VC2003. – user3159253

+0

Как вы можете _'control'_ значение с регулярными выражениями? – ForceBru

+3

В качестве альтернативы вы можете использовать стороннюю библиотеку, например [PCRE] (http://www.airesoft.co.uk/pcre), чтобы решить вашу задачу. Проверьте [это сообщение в блоге] (https://hiddencodes.wordpress.com/2015/02/18/build-and-use-pcre-in-windows/), чтобы узнать подробности. – user3159253

ответ

2

Ну, если вы не хотите использовать сторонние библиотеки (почему, кстати?), Вам придется пройти весь путь пешком ... (Звучит легко, не так ли?)

Во-первых, ваше регулярное выражение не похоже на то, что вам нужно. Ты это пробовал? Это один, по крайней мере, соответствует вашим пример строки:

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 == '}'; 
} 
+0

Спасибо за альтернативное решение. Я вырос с регулярным выражением, чтобы проверить ценность. :) – Skydreampower

Смежные вопросы