我有一个正则表达式包含通过或条件连接的各个子组:
([[:alpha:]]+)|([[:digit:]]+)
当我匹配字符串1 a 2
时,我会收到三个匹配:1
,a
和2
。
在C ++中是否有办法确定哪些子模式匹配?
答案 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 )