2015-11-03 4 views
1

Я пытаюсь сопоставить буквальное число, например. 1600442 с помощью набора регулярных выражений в Microsoft Visual Studio 2010. Мои регулярные выражения просто:Соответствие регулярному выражению MSVC

1600442|7654321 
7895432 

Проблема заключается в том, что оба выше соответствует строке.

Реализация этого в Python дает ожидаемый результат: импорта повторно

serial = "1600442" 
re1 = "1600442|7654321" 
re2 = "7895432" 

m = re.match(re1, serial) 
if m: 
    print "found for re1" 
    print m.groups() 

m = re.match(re2, serial) 
if m: 
    print "found for re2" 
    print m.groups() 

Придает OUTPUT

found for re1 
() 

Что я ожидал. Используя этот код на C++ однако:

#include <string> 
#include <iostream> 
#include <regex> 

int main(){ 
    std::string serial = "1600442"; 
    std::tr1::regex re1("1600442|7654321"); 
    std::tr1::regex re2("7895432"); 

    std::tr1::smatch match; 

    std::cout << "re1:" << std::endl; 
    std::tr1::regex_search(serial, match, re1); 
    for (auto i = 0;i <match.length(); ++i) 
      std::cout << match[i].str().c_str() << " "; 

    std::cout << std::endl << "re2:" << std::endl; 
    std::tr1::regex_search(serial, match, re2); 
    for (auto i = 0;i <match.length(); ++i) 
      std::cout << match[i].str().c_str() << " "; 
    std::cout << std::endl; 
    std::string s; 
    std::getline (std::cin,s); 
} 

дает мне:

re1: 
1600442 
re2: 
1600442 

, который не то, что я ожидал. Почему я получаю здесь матч?

+0

Попробуйте обернуть его между '(?: ...)' –

+2

Кажется, переменная 'smatch' не перезаписывается. –

ответ

0

smatch не перезаписывается вторым вызовом regex_search, поэтому он остается нетронутым и содержит первые результаты.

Вы можете переместить код регулярного выражения поиска, чтобы отдельный метод:

void FindMeText(std::regex re, std::string serial) 
{ 
    std::smatch match; 
    std::regex_search(serial, match, re); 
    for (auto i = 0;i <match.length(); ++i) 
      std::cout << match[i].str().c_str() << " "; 
    std::cout << std::endl; 
} 

int main(){ 
    std::string serial = "1600442"; 
    std::regex re1("^(?:1600442|7654321)"); 
    std::regex re2("^7895432"); 
    std::cout << "re1:" << std::endl; 
    FindMeText(re1, serial); 
    std::cout << "re2:" << std::endl; 
    FindMeText(re2, serial); 
    std::cout << std::endl; 
    std::string s; 
    std::getline (std::cin,s); 
} 

Результат:

enter image description here

Обратите внимание, что Python re.match ищет сопоставления с образцом в начале только строки, поэтому я предлагаю использовать ^ (начало строки) в начале каждого шаблона.

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