C ++正则表达式:哪个组匹配?

时间:2017-07-06 13:05:01

标签: c++ regex

我有一个正则表达式包含通过或条件连接的各个子组:

([[:alpha:]]+)|([[:digit:]]+)

当我匹配字符串1 a 2时,我会收到三个匹配:1a2

在C ++中是否有办法确定哪些子模式匹配?

1 个答案:

答案 0 :(得分:0)

不直接。

使用List<Data.Area> ListOfToolsOk = Area.Where(x => x.AREA == CHANGE THIS -> "ENG" && x.TEAM == CHANGE THIS -> "516" && x.STANDBY == 0).ToList();库, match_result 类负责子匹配,它有一个名为std::match_results::size的方法,并且你有可以找到子匹配的数量。

例如:

std::regex

此处输出为 6 而非 5 ,因为匹配本身也会计算在内。您可以通过std::string str( "one two three four five" ); std::regex rx( "(\\w+)(\\w+)(\\w+)(\\w+)(\\w+)" ); std::match_results< std::string::const_iterator > mr; std::regex_search( str, mr, rx ); std::cout << mr.size() << '\n'; // 6 方法或.str( number )

访问它们

因为子匹配从从左到右计算,你应该在看到 size 方法的输出后找出女巫组匹配。

如果您将 rx 更改为operator[],那么尺寸= 0

如果您将 rx 更改为"(\\w+)(\\d+)(\\w+)",则尺寸 2 。这意味着您有整个成功匹配总和匹配

例如:

"(\\w+).+"

两者的输出是:一个

此外,如果您只想打印子匹配,您可以使用具有索引的简单循环,此索引从 1开始 0

例如:

std::string str( "one two three four five" );
std::regex rx( "(\\w+).+" );
std::match_results< std::string::const_iterator > mr;

std::regex_search( str, mr, rx );

std::cout << mr.str( 1 ) << '\n'; // one
std::cout << mr[ 1 ] << '\n';     // one

输出是:

std::string str( "one two three four five" );
std::regex rx( "(\\w+) \\w+ (\\w+) \\w+ (\\w+)" );
std::match_results< std::string::const_iterator > mr;

std::regex_search( str, mr, rx );

for( std::size_t index = 1; index < mr.size(); ++index ){
    std::cout << mr[ index ] << '\n';
}

通过说确定哪个子模式匹配
如果您的意思是指定应从搜索引擎返回哪个子匹配,那么使用one three five 您的回答是可以确定:

例如:(迭代每次匹配的第二次子匹配)

std::regex_token_iterator

最后一个参数为2 std::string str( "How are you today ? I am fine . How about you ?" ); std::regex rx( "(\\w+) (\\w+) ?" ); std::match_results< std::string::const_iterator > mr; std::regex_token_iterator< std::string::const_iterator > first( str.begin(), str.end(), rx, 2 ), last; while( first != last ){ std::cout << first->str() << '\n'; ++first; } ,这意味着您只需要第二个子匹配。所以输出是:

( str.begin(), str.end(), rx, 2 )