12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- //
- // Created by Tobias Hieta on 20/08/15.
- //
- #include "CachedRegexMatcher.h"
- #include "QsLog.h"
- /////////////////////////////////////////////////////////////////////////////////////////
- bool CachedRegexMatcher::addMatcher(const QString& pattern, const QVariant& result)
- {
- QRegExp matcher(pattern);
- if (!matcher.isValid())
- {
- QLOG_WARN() << "Could not compile pattern:" << pattern;
- return false;
- }
- m_matcherList.push_back(qMakePair(matcher, result));
- return true;
- }
- /////////////////////////////////////////////////////////////////////////////////////////
- QVariant CachedRegexMatcher::match(const QString& input)
- {
- // first we check if this match has already happened before
- if (m_matcherCache.contains(input))
- return m_matcherCache.value(input);
- // otherwise try to iterate our list and find a match
- foreach(const MatcherValuePair& matcher, m_matcherList)
- {
- QRegExp re(matcher.first);
- if (re.indexIn(input) != -1)
- {
- // found match
- QVariant returnValue = matcher.second;
- if (re.captureCount() > 0 && matcher.second.type() == QVariant::String)
- {
- QString value(matcher.second.toString());
- for (int i = 0; i < re.captureCount(); i ++)
- {
- QString argFmt = QString("%%1").arg(i + 1);
- if (value.contains(argFmt))
- value = value.arg(re.cap(i + 1));
- }
- returnValue = QVariant(value);
- }
- // now cache the match and the final value
- m_matcherCache.insert(input, returnValue);
- return returnValue;
- }
- }
- QLOG_DEBUG() << "No match for:" << input;
- // no match at all
- return QVariant();
- }
- /////////////////////////////////////////////////////////////////////////////////////////
- void CachedRegexMatcher::clear()
- {
- m_matcherCache.clear();
- m_matcherList.clear();
- }
|