X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfind.cpp;h=57a25e929f38ee911c0c27e4389a4eb0af680db0;hb=2de30c62f8d671a8c8d4d52a6a7310e2c5ca84de;hp=22a6b40393ae20e7db80eca4cc37bec3589d5e93;hpb=b8216513d60c460a1f7080a3112ad34c1519061d;p=lyx.git diff --git a/src/lyxfind.cpp b/src/lyxfind.cpp index 22a6b40393..57a25e929f 100644 --- a/src/lyxfind.cpp +++ b/src/lyxfind.cpp @@ -951,44 +951,53 @@ int MatchStringAdv::findAux(DocIterator const & cur, int len, bool at_begin) con if (at_begin && (opt.restr == FindAndReplaceOptions::R_ONLY_MATHS && !cur.inMathed()) ) return 0; + docstring docstr = stringifyFromForSearch(opt, cur, len); - LYXERR(Debug::FIND, "Matching against '" << lyx::to_utf8(docstr) << "'"); string str = normalize(docstr, true); + LYXERR(Debug::FIND, "Matching against '" << lyx::to_utf8(docstr) << "'"); LYXERR(Debug::FIND, "After normalization: '" << str << "'"); - if (! use_regexp) { - LYXERR(Debug::FIND, "Searching in normal mode: par_as_string='" << par_as_string << "', str='" << str << "'"); - LYXERR(Debug::FIND, "Searching in normal mode: lead_as_string='" << lead_as_string << "', par_as_string_nolead='" << par_as_string_nolead << "'"); - if (at_begin) { - LYXERR(Debug::FIND, "size=" << par_as_string.size() << ", substr='" << str.substr(0, par_as_string.size()) << "'"); - if (str.substr(0, par_as_string.size()) == par_as_string) - return par_as_string.size(); - } else { - size_t pos = str.find(par_as_string_nolead); - if (pos != string::npos) - return par_as_string.size(); - } - } else { + + if (use_regexp) { LYXERR(Debug::FIND, "Searching in regexp mode: at_begin=" << at_begin); - // Try all possible regexp matches, - //until one that verifies the braces match test is found regex const & p_regexp = at_begin ? regexp : regexp2; sregex_iterator re_it(str.begin(), str.end(), p_regexp); match_results const & m = *re_it; + // Check braces on the segment that matched the entire regexp expression, // plus the last subexpression, if a (.*?) was inserted in the constructor. if (!braces_match(m[0].first, m[0].second, open_braces)) return 0; + // Check braces on segments that matched all (.*?) subexpressions, // except the last "padding" one inserted by lyx. for (size_t i = 1; i < m.size() - 1; ++i) if (!braces_match(m[i].first, m[i].second)) return false; + // Exclude from the returned match length any length // due to close wildcards added at end of regexp if (close_wildcards == 0) return m[0].second - m[0].first; - else - return m[m.size() - close_wildcards].first - m[0].first; + + return m[m.size() - close_wildcards].first - m[0].first; + } + + // else !use_regexp: but all code paths above return + LYXERR(Debug::FIND, "Searching in normal mode: par_as_string='" + << par_as_string << "', str='" << str << "'"); + LYXERR(Debug::FIND, "Searching in normal mode: lead_as_string='" + << lead_as_string << "', par_as_string_nolead='" + << par_as_string_nolead << "'"); + + if (at_begin) { + LYXERR(Debug::FIND, "size=" << par_as_string.size() + << ", substr='" << str.substr(0, par_as_string.size()) << "'"); + if (str.substr(0, par_as_string.size()) == par_as_string) + return par_as_string.size(); + } else { + size_t pos = str.find(par_as_string_nolead); + if (pos != string::npos) + return par_as_string.size(); } return 0; }