/*
* 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