/* * RegexUtils.cpp * * Copyright (C) 2009-12 by RStudio, PBC * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ #include #include #include #include #include #include #include #include #include namespace rstudio { namespace core { namespace regex_utils { boost::regex wildcardPatternToRegex(const std::string& pattern) { // split into componenents using namespace boost::algorithm; std::vector components; split(components, pattern, is_any_of("*"), token_compress_on); // build and return regex std::string regex; for (std::size_t i=0; i 0) regex.append(".*"); regex.append("\\Q"); regex.append(components.at(i)); regex.append("\\E"); } return boost::regex(regex); } boost::regex regexIfWildcardPattern(const std::string& term) { // create wildcard pattern if the search has a '*' bool hasWildcard = term.find('*') != std::string::npos; boost::regex pattern; if (hasWildcard) pattern = regex_utils::wildcardPatternToRegex(term); return pattern; } bool textMatches(const std::string& text, const boost::regex& regex, bool prefixOnly, bool caseSensitive) { boost::smatch match; boost::match_flag_type flags = boost::match_default; if (prefixOnly) flags |= boost::match_continuous; return regex_search(caseSensitive ? text : string_utils::toLower(text), match, regex, flags); } Error filterString(const std::string& input, const std::vector& filters, std::string* pOutput) { try { // create input stream std::istringstream inputStream(input); inputStream.exceptions(std::istream::failbit | std::istream::badbit); // create filtered output stream std::ostringstream outputStream; outputStream.exceptions(std::istream::failbit | std::istream::badbit); boost::iostreams::filtering_ostream filteredStream; for (std::size_t i=0; i filters; filters.push_back(filter); return filterString(input, filters, pOutput); } } // namespace regex_utils } // namespace core } // namespace rstudio