是否可以在正则表达式中命名子模式,然后通过C ++中的子模式名称提取匹配项?
例如,我可以使用这样的正则表达式:text bla bla PLACE delimiter bla bla TIME
然后将该正则表达式与字符串匹配,如果匹配,则能够执行:
smatch sm;
sm[PLACE] or sm[TIME]
编辑:根据我的理解,这在C ++ 11的标准正则表达式中不可用, 但是提升正则表达式有这个功能。
我的另一个问题是,如果PLACE有多个匹配怎么办?
答案 0 :(得分:3)
这些被称为命名捕获组,它们在这里描述:
http://www.regular-expressions.info/named.html
它们仅受一些正则表达式引擎的支持。 C ++没有具体提及,但如果它使用PCRE 7.2或更高版本,它应该支持它们。如果你的正则表达式引擎不支持它们,你将不得不坚持传统的编号捕获组。
答案 1 :(得分:1)
答案 2 :(得分:0)
Boost.Regex的match_results
声称可以。
const_reference operator[](int n) const;
const_reference operator[](const char_type* n) const;
template <class Traits, class A>
const_reference operator[](const std::basic_string<char_type, Traits, A>& n) const;
template <class charT>
const_reference operator[](const charT* n) const;
template <class charT, class Traits, class A>
const_reference operator[](const std::basic_string<charT, Traits, A>& n) const;
接受字符串的重载,返回对
sub_match
对象的引用,该对象表示与命名子表达式 n 匹配的字符序列。如果没有这样的命名子表达式,则返回sub_match
成员为false的matched
对象。
我的另一个问题是,如果PLACE有多个匹配怎么办?
在这种情况下,您有几个选择。默认情况下,Boost.Regex只返回最后一个匹配项。 boost文档的this部分告诉您如何启用重复捕获。另一种可行的方法(取决于正则表达式)是做类似的事情:
string text("abc abd");
regex regex("ab.");
string::const_iterator start=text.cbegin(), stop=text.cend();
match_results<std::string::const_iterator> results;
while(regex_search(start,stop,results) {
cout<<string(match[0].first, match[0].second)<<endl;
start=match[0].second;
}