带有可选组的C ++正则表达式无法按预期工作

时间:2017-03-24 16:38:43

标签: regex optional

我正在使用:

^-(.)=((\d{1,3})(F|f))*((\d{1,2})(I|i))*((\d{1,2})(/(2|4|8|16|32|64))*)*$

针对

-s=35

模式匹配结果是

Found Match 0 '-s=35'
Found Match 1 's'
Found Match 2 ''
Found Match 3 ''
Found Match 4 ''
Found Match 5 ''
Found Match 6 ''
Found Match 7 ''
Found Match 8 '5'
Found Match 9 '5'
Found Match 10 ''
Found Match 11 ''

我预计它会增加35 在小组

((\d{1,2})(/(2|4|8|16|32|64))*

特别是正则表达式子组

(\d{1,2})

但领先的数字'已经迷路了。 不应使用先前的可选子组,因为两者都需要不区分大小写的字母。 数据-s=7按预期工作。

2 个答案:

答案 0 :(得分:1)

@ sln

感谢您的努力。 我正在运行2015社区Visual Studio的(非常)略旧版本 使用类似的旧版C ++和.Net。 我正在运行IDE和相关编译的默认标志,项目位置除外。 我已经接受了你的代码,删除了CString,为每个匹配元素添加了一个strlen,并使它成为一个“主要”程序。

#include <regex>   
using namespace std;
void main()
{
    char *pTarget = "-s=35\0";
    std::regex rx("^-(.)=((\\d{1,3})(F|f))*((\\d{1,2})(I|i))*((\\d{1,2})(/(2|4|8|16|32|64))*)*$");
    std::cmatch cm;
    std::regex_match(pTarget, cm, rx);
    if (cm.size() == 0)
    {
        printf("No Matches Found\n");
        return;
    }
    int len;
    for (unsigned idxMatch = 0; idxMatch < cm.size(); idxMatch++)
    {
        len = strlen(cm[idxMatch].str().c_str());
        printf("Found Match %2d ln %d '%s'\n", idxMatch, len, cm[idxMatch].str().c_str());
    }
}

它与我之前报道的结果相同。

Found Match  0 ln 5 '-s=35'
Found Match  1 ln 1 's'
Found Match  2 ln 0 ''
Found Match  3 ln 0 ''
Found Match  4 ln 0 ''
Found Match  5 ln 0 ''
Found Match  6 ln 0 ''
Found Match  7 ln 0 ''
Found Match  8 ln 1 '5'
Found Match  9 ln 1 '5'
Found Match 10 ln 0 ''
Found Match 11 ln 0 ''

可悲的是,不是你得到的结果。 对我来说似乎不是一个编码问题。 你有什么看法?

答案 1 :(得分:0)

I am using Microsoft C++ in Visual Studio Community 2015

我使用相同的IDE测试了您的代码 使用局部变量代码。

结果不是您报告的内容 我得到的结果是正确的。

IDE

Microsoft Visual Studio Community 2015
Version 14.0.25431.01 Update 3
Microsoft .NET Framework
Version 4.6.01055

Installed Version: Community

Visual C++ 2015   00322-20000-00000-AA378
Microsoft Visual C++ 2015

代码

#include <regex>   

char *pTarget = "-s=35\0";
std::regex rx("^-(.)=((\\d{1,3})(F|f))*((\\d{1,2})(I|i))*((\\d{1,2})(/(2|4|8|16|32|64))*)*$");
std::cmatch cm;

CString result = _T("");

std::regex_match( pTarget, cm, rx);

if (cm.size() == 0)
{
    result = "No Matches Found\n";
}
else
{
    for (unsigned idxMatch = 0; idxMatch < cm.size(); idxMatch++)
    {
        char buff[2048] = {'\0'};
        sprintf( buff, "Found Match %d '%s'\n", idxMatch, cm[idxMatch].str().c_str());
        result += buff;
    }
}
this->MessageBox( result, _T(""), MB_ICONINFORMATION );

输出

enter image description here

这是我创建的默认C ++控制台项目,用于测试答案中的代码。

结果仍然相同。并不是你得到的。

编译器cmdline

/Yu"stdafx.h" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl 
/Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D 
"NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" 
/errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD 
/Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" 
/Fp"x64\Release\CPP_RxTest1.pch" 

Linker cmdline

/OUT:"C:\Temp\Junk\CPP_RxTest1\x64\Release\CPP_RxTest1.exe" 
/MANIFEST /LTCG:incremental /NXCOMPAT 
/PDB:"C:\Temp\Junk\CPP_RxTest1\x64\Release\CPP_RxTest1.pdb" 
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" 
"winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" 
"ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" 
"odbccp32.lib" /DEBUG /MACHINE:X64 /OPT:REF /INCREMENTAL:NO 
/PGD:"C:\Temp\Junk\CPP_RxTest1\x64\Release\CPP_RxTest1.pgd" 
/SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' 
uiAccess='false'" 
/ManifestFile:"x64\Release\CPP_RxTest1.exe.intermediate.mani
fest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 

CPP

// CPP_RxTest1.cpp : Defines the entry point for the console application.
//

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


int main()
{
    char *pTarget = "-s=35\0";
    std::regex rx("^-(.)=((\\d{1,3})(F|f))*((\\d{1,2})(I|i))*((\\d{1,2})(/(2|4|8|16|32|64))*)*$");
    std::cmatch cm;
    std::regex_match(pTarget, cm, rx);
    if (cm.size() == 0)
    {
        printf("No Matches Found\n");
        return 0;
    }
    int len;
    for (unsigned idxMatch = 0; idxMatch < cm.size(); idxMatch++)
    {
        len = strlen(cm[idxMatch].str().c_str());
        printf("Found Match %2d ln %d '%s'\n", idxMatch, len, cm[idxMatch].str().c_str());
    }

    return 0;
}

输出

Found Match  0 ln 5 '-s=35'
Found Match  1 ln 1 's'
Found Match  2 ln 0 ''
Found Match  3 ln 0 ''
Found Match  4 ln 0 ''
Found Match  5 ln 0 ''
Found Match  6 ln 0 ''
Found Match  7 ln 0 ''
Found Match  8 ln 2 '35'
Found Match  9 ln 2 '35'
Found Match 10 ln 0 ''
Found Match 11 ln 0 ''
Press any key to continue . . .