C++ c++;11-正则表达式匹配

C++ c++;11-正则表达式匹配,c++,regex,c++11,C++,Regex,C++11,我正在使用正则表达式从字符串中提取信息 auto version = { // comments shows the expected output // version // output : (year, month, sp#, patch#) "2012.12", // "2012", "12", "", "" "2012.12-1", // "2012", "12", "", "1" "2012.12-SP

我正在使用正则表达式从字符串中提取信息

  auto version = { // comments shows the expected output
    // version         // output : (year, month, sp#, patch#)
    "2012.12",         // "2012", "12", "", ""
    "2012.12-1",       // "2012", "12", "", "1" 
    "2012.12-SP1",     // "2012", "12", "SP1", "" 
    "2012.12-SP2-1",   // "2012", "12", "SP2", "1" 
    "I-2013.12-2",     // "2013", "12", "", "2"
    "J-2014.09",       // "2014", "09", "", ""
    "J-2014.09-SP2-1", // "2014", "09", "SP2", "1"
};
我的正则表达式如下:

    //                  J   -  2014       .  09      -  SP2      -  1  
std::regex regexExpr("[A-Z]?-?([0-9]{4})\\.([0-9]{2})-?(SP[1-9])?-?([1-9])?.*");

这似乎奏效了。我对此不是很有信心,因为我在正则表达式方面没有太多的专业知识。正则表达式正确吗?这可以改进吗

您可以使用
\w{2,}\d
作为正则表达式,匹配长度为2或2以上的任何单词字符组合(
\w{2,}
)(以避免在某些字符串的开头匹配
j
)或长度为1的数字(
\d
)(用于匹配某些字符串末尾的1)

您可以使用
sub_match
类模板实现此目的:

正则表达式引擎使用类模板
sub_match
来表示由标记的子表达式匹配的字符序列。匹配是由正则表达式匹配的目标范围内的[begin,end]对,但具有额外的观察函数以提高代码清晰度


请注意,您当前允许类似于
-2012.12--
的内容。如果这不是您的目标,请将作为一个整体可选的部分分组。
(?:[a-Z])?…
我需要2012,12。基本上我想将字符串拆分为(年、月、sp#、补丁#)。我已经更新了对它的评论。@LightningRacisinObrit我不确定一个只有regex的问题在代码审查中是否会成功。我们可以审查使用它的实现、类或函数,但对于一个基本工具,如regex,我们只能说这么多…@Phrancis:我不同意。我想分成两部分(年、月、SP、补丁).
\w+
匹配字母数字,因为年份只是数字,我认为
\d+
可能是better@Anand首先,我的方法是查找所有未拆分的匹配项,如果您想
SP1
,您不能使用
\d+
查看编辑,首先我错过了
j
!!我们不想在开始时匹配
j
。但是我是否要匹配
J-2014.09-SP3-1