我正在使用:
^-(.)=((\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
按预期工作。
答案 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 );
输出
这是我创建的默认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 . . .