可以将临时正则表达式对象传递给 regex_match 吗?
Is it okay to pass a temporary regex object to regex_match?
大多数使用 boost::regex_match
的示例在调用 match 之前构造 boost::regex
对象;例如
boost::regex pattern("(...)");
boost::smatch match;
if (boost::regex_match(text, match, pattern)) {
// use the match object here
}
(有关其他示例,请参阅 https://github.com/boostorg/regex/tree/develop/example/snippets)。
但是,假设我改为将 临时 regex
对象传递给 regex_match
,例如
boost::smatch match;
if (boost::regex_match(text, match, boost::regex("(...)"))) {
// use the match object here
}
此代码有效吗?也就是说,boost::regex
对象是否需要与 boost::smatch
对象一样长,或者该生命周期要求是否仅适用于匹配的字符串?代码似乎工作正常,但我担心如果 smatch
对象在内部保留对用于匹配的正则表达式的引用,我可能 运行 会遇到麻烦。
我在 https://www.boost.org/doc/libs/1_79_0/libs/regex/doc/html/index.html 找不到明确记录的内容,但可能我错过了。
首先,从设计的角度来看,在 boost::smatch
中存储对 boost::regex
的引用是没有意义的。
查看 the implementation 确认:
template <class BidiIterator, class Allocator>
class match_results
{
// ...
vector_type m_subs; // subexpressions
BidiIterator m_base; // where the search started from
sub_match<BidiIterator> m_null; // a null match
boost::shared_ptr<named_sub_type> m_named_subs; // Shared copy of named subs in the regex object
int m_last_closed_paren; // Last ) to be seen - used for formatting
bool m_is_singular; // True if our stored iterators are singular
};
大多数使用 boost::regex_match
的示例在调用 match 之前构造 boost::regex
对象;例如
boost::regex pattern("(...)");
boost::smatch match;
if (boost::regex_match(text, match, pattern)) {
// use the match object here
}
(有关其他示例,请参阅 https://github.com/boostorg/regex/tree/develop/example/snippets)。
但是,假设我改为将 临时 regex
对象传递给 regex_match
,例如
boost::smatch match;
if (boost::regex_match(text, match, boost::regex("(...)"))) {
// use the match object here
}
此代码有效吗?也就是说,boost::regex
对象是否需要与 boost::smatch
对象一样长,或者该生命周期要求是否仅适用于匹配的字符串?代码似乎工作正常,但我担心如果 smatch
对象在内部保留对用于匹配的正则表达式的引用,我可能 运行 会遇到麻烦。
我在 https://www.boost.org/doc/libs/1_79_0/libs/regex/doc/html/index.html 找不到明确记录的内容,但可能我错过了。
首先,从设计的角度来看,在 boost::smatch
中存储对 boost::regex
的引用是没有意义的。
查看 the implementation 确认:
template <class BidiIterator, class Allocator>
class match_results
{
// ...
vector_type m_subs; // subexpressions
BidiIterator m_base; // where the search started from
sub_match<BidiIterator> m_null; // a null match
boost::shared_ptr<named_sub_type> m_named_subs; // Shared copy of named subs in the regex object
int m_last_closed_paren; // Last ) to be seen - used for formatting
bool m_is_singular; // True if our stored iterators are singular
};