是否可以在正则表达式中命名子模式,然后通过C ++中的子模式名称提取匹配?

时间:2014-01-23 12:30:50

标签: c++ regex c++11

是否可以在正则表达式中命名子模式,然后通过C ++中的子模式名称提取匹配项?

例如,我可以使用这样的正则表达式:text bla bla PLACE delimiter bla bla TIME

然后将该正则表达式与字符串匹配,如果匹配,则能够执行:

smatch sm;
sm[PLACE] or sm[TIME]   

编辑:根据我的理解,这在C ++ 11的标准正则表达式中不可用,       但是提升正则表达式有这个功能。

我的另一个问题是,如果PLACE有多个匹配怎么办?

3 个答案:

答案 0 :(得分:3)

这些被称为命名捕获组,它们在这里描述:

http://www.regular-expressions.info/named.html

它们仅受一些正则表达式引擎的支持。 C ++没有具体提及,但如果它使用PCRE 7.2或更高版本,它应该支持它们。如果你的正则表达式引擎不支持它们,你将不得不坚持传统的编号捕获组。

答案 1 :(得分:1)

C ++ 11正则表达式允许不同的风格,其功能略有不同。正则表达式默认为ECMAscript (1),它没有命名的捕获组(2)

您可以尝试使用其他一种(3)

答案 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;
}