📄 regex_match.hpp
字号:
// hack to work around gcc optimisation bug
// just expand the contents of _inc_one here:
if(*first == '\n')
{
last_line = ++first;
++clines;
}
else
++first;
#else
_inc_one(clines, last_line, first);
#endif
}
if(first == last)
break;
if( access::can_start(*first, _map, (unsigned char)mask_any) )
{
if(query_match_aux(first, last, m, e, flags, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
if(m[0].second == last)
return cmatches;
// update to end of what matched
// trying to match again with match_not_null set if this
// is a null match...
need_init = true;
if(first == m[0].second)
{
next_base = m[0].second;
pd.temp_match.init_fail(next_base, last);
m.init_fail(next_base, last);
if(query_match_aux(first, last, m, e, flags | match_not_null, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
}
else
{
need_init = false;
for(unsigned int i = 0; (restart != first) && (i < access::leading_length(e)); ++i, --restart)
{} // dwa 10/20/2000 - warning suppression for MWCW
if(restart != last)
++restart;
_skip_and_inc(clines, last_line, first, restart);
}
}
if(need_init)
{
_skip_and_inc(clines, last_line, first, m[0].second);
next_base = m[0].second;
pd.temp_match.init_fail(next_base, last);
m.init_fail(next_base, last);
}
}
else
{
for(unsigned int i = 0; (restart != first) && (i < access::leading_length(e)); ++i, --restart)
{} // dwa 10/20/2000 - warning suppression for MWCW
if(restart != last)
++restart;
_skip_and_inc(clines, last_line, first, restart);
}
}
else
_inc_one(clines, last_line, first);
}
}
break;
case regbase::restart_line:
{
// do search optimised for line starts:
while(first != last)
{
// find first charcter after a line break:
--first;
if(*first == '\n')
--clines;
while((first != last) && (*first != '\n'))
++first;
if(first == last)
break;
++first;
if(first == last)
break;
++clines;
last_line = first;
if( access::can_start(*first, _map, (unsigned char)mask_any) )
{
if(query_match_aux(first, last, m, e, flags, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
if(m[0].second == last)
return cmatches;
// update to end of what matched
// trying to match again with match_not_null set if this
// is a null match...
need_init = true;
if(first == m[0].second)
{
next_base = m[0].second;
pd.temp_match.init_fail(next_base, last);
m.init_fail(next_base, last);
if(query_match_aux(first, last, m, e, flags | match_not_null, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
}
else
{
need_init = false;
for(unsigned int i = 0; (restart != first) && (i < access::leading_length(e)); ++i, --restart)
{} // dwa 10/20/2000 - warning suppression for MWCW
if(restart != last)
++restart;
_skip_and_inc(clines, last_line, first, restart);
}
}
if(need_init)
{
_skip_and_inc(clines, last_line, first, m[0].second);
next_base = m[0].second;
pd.temp_match.init_fail(next_base, last);
m.init_fail(next_base, last);
}
}
else
{
for(unsigned int i = 0; (restart != first) && (i < access::leading_length(e)); ++i, --restart)
{} // dwa 10/20/2000 - warning suppression for MWCW
if(restart != last)
++restart;
_skip_and_inc(clines, last_line, first, restart);
}
}
else
_inc_one(clines, last_line, first);
}
}
break;
case regbase::restart_continue:
{
if(!leading_match)
return cmatches;
while(first != last)
{
if( access::can_start(*first, _map, (unsigned char)mask_any) )
{
if(query_match_aux(first, last, m, e, flags, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
if(m[0].second == last)
return cmatches;
// update to end of what matched
// trying to match again with match_not_null set if this
// is a null match...
if(first == m[0].second)
{
next_base = m[0].second;
pd.temp_match.init_fail(next_base, last);
m.init_fail(next_base, last);
if(query_match_aux(first, last, m, e, flags | match_not_null, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
}
else
return cmatches; // can't continue from null match
}
_skip_and_inc(clines, last_line, first, m[0].second);
next_base = m[0].second;
pd.temp_match.init_fail(next_base, last);
m.init_fail(next_base, last);
continue;
}
}
return cmatches;
}
}
break;
}
// finally check trailing null string:
if(access::first(e)->can_be_null)
{
if(query_match_aux(first, last, m, e, flags, pd, &restart))
{
m.set_line(clines, last_line);
++cmatches;
if(foo(m) == false)
return cmatches;
}
}
return cmatches;
}
#if defined(BOOST_REGEX_NO_TEMPLATE_SWITCH_MERGE)
} // namespace {anon}
#endif
} // namespace re_detail
//
// proc regex_match
// returns true if the specified regular expression matches
// the whole of the input. Fills in what matched in m.
//
template <class iterator, class Allocator, class charT, class traits, class Allocator2>
bool regex_match(iterator first, iterator last, match_results<iterator, Allocator>& m, const reg_expression<charT, traits, Allocator2>& e, unsigned flags = match_default)
{
// prepare m for failure:
if((flags & match_init) == 0)
{
m.set_size(e.mark_count(), first, last);
m.set_base(first);
m.set_line(1, first);
}
flags |= match_all; // must match all of input.
re_detail::_priv_match_data<iterator, Allocator> pd(m, first, last, e.size());
iterator restart;
bool result = re_detail::query_match_aux(first, last, m, e, flags, pd, &restart);
return result;
}
template <class iterator, class charT, class traits, class Allocator2>
bool regex_match(iterator first, iterator last, const reg_expression<charT, traits, Allocator2>& e, unsigned flags = match_default)
{
match_results<iterator> m;
return regex_match(first, last, m, e, flags);
}
//
// query_match convenience interfaces:
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
//
// this isn't really a partial specialisation, but template function
// overloading - if the compiler doesn't support partial specialisation
// then it really won't support this either:
template <class charT, class Allocator, class traits, class Allocator2>
inline bool regex_match(const charT* str,
match_results<const charT*, Allocator>& m,
const reg_expression<charT, traits, Allocator2>& e,
unsigned flags = match_default)
{
return regex_match(str, str + traits::length(str), m, e, flags);
}
template <class ST, class SA, class Allocator, class charT, class traits, class Allocator2>
inline bool regex_match(const std::basic_string<charT, ST, SA>& s,
match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
const reg_expression<charT, traits, Allocator2>& e,
unsigned flags = match_default)
{
return regex_match(s.begin(), s.end(), m, e, flags);
}
template <class charT, class traits, class Allocator2>
inline bool regex_match(const charT* str,
const reg_expression<charT, traits, Allocator2>& e,
unsigned flags = match_default)
{
match_results<const charT*> m;
return regex_match(str, str + traits::length(str), m, e, flags);
}
template <class ST, class SA, class charT, class traits, class Allocator2>
inline bool regex_match(const std::basic_string<charT, ST, SA>& s,
const reg_expression<charT, traits, Allocator2>& e,
unsigned flags = match_default)
{
typedef typename std::basic_string<charT, ST, SA>::const_iterator iterator;
match_results<iterator> m;
return regex_match(s.begin(), s.end(), m, e, flags);
}
#else // partial ordering
inline bool regex_match(const char* str,
cmatch& m,
const regex& e,
unsigned flags = match_default)
{
return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
}
inline bool regex_match(const char* str,
const regex& e,
unsigned flags = match_default)
{
match_results<const char*> m;
return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
}
#ifndef BOOST_NO_WREGEX
inline bool regex_match(const wchar_t* str,
wcmatch& m,
const wregex& e,
unsigned flags = match_default)
{
return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
}
inline bool regex_match(const wchar_t* str,
const wregex& e,
unsigned flags = match_default)
{
match_results<const wchar_t*> m;
return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
}
#endif
inline bool regex_match(const std::string& s,
match_results<std::string::const_iterator, regex::allocator_type>& m,
const regex& e,
unsigned flags = match_default)
{
return regex_match(s.begin(), s.end(), m, e, flags);
}
inline bool regex_match(const std::string& s,
const regex& e,
unsigned flags = match_default)
{
match_results<std::string::const_iterator, regex::allocator_type> m;
return regex_match(s.begin(), s.end(), m, e, flags);
}
#if !defined(BOOST_NO_WREGEX)
inline bool regex_match(const std::basic_string<wchar_t>& s,
match_results<std::basic_string<wchar_t>::const_iterator, wregex::allocator_type>& m,
const wregex& e,
unsigned flags = match_default)
{
return regex_match(s.begin(), s.end(), m, e, flags);
}
inline bool regex_match(const std::basic_string<wchar_t>& s,
const wregex& e,
unsigned flags = match_default)
{
match_results<std::basic_string<wchar_t>::const_iterator, wregex::allocator_type> m;
return regex_match(s.begin(), s.end(), m, e, flags);
}
#endif
#endif
template <class iterator, class Allocator, class charT, class traits, class Allocator2>
bool regex_search(iterator first, iterator last, match_results<iterator, Allocator>& m, const reg_expression<charT, traits, Allocator2>& e, unsigned flags = match_default)
{
if(e.flags() & regbase::failbit)
return false;
typedef typename traits::size_type traits_size_type;
typedef typename traits::uchar_type traits_uchar_type;
return re_detail::reg_grep2(re_detail::grep_search_predicate<iterator, Allocator>(&m), first, last, e, flags, m.allocator());
}
//
// regex_search convenience interfaces:
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
//
// this isn't really a partial specialisation, but template function
// overloading - if the compiler doesn't support partial specialisation
// then it really won't support this either:
template <class charT, class Allocator, class traits, class Allocator2>
inline bool regex_search(const charT*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -