postParse = function postParse(regexp, message, user) {
  if (_.isNull(regexp)) {
    return null;
  }

  regexp = regexp.replace(searchRE, (match, p1, p2) => {
    let replacements = null;

    switch (p1) {
      case 'name': replacements = message.names; break;
      case 'noun': replacements = message.nouns; break;
      case 'adverb': replacements = message.adverbs; break;
      case 'verb': replacements = message.verbs; break;
      case 'pronoun': replacements = message.pronouns; break;
      case 'adjective': replacements = message.adjectives; break;
      default: break;
    }

    if (replacements.length > 0) {
      if (p2 === 's') {
        return `(${replacements.join('|')})`;
      }

      let index = Number.parseInt(p2);
      index = index ? index - 1 : 0;
      if (index < replacements.length) {
        return `(${replacements[index]})`;
      }
    }

    return '';
  });

  if (user && user.history) {
    const history = user.history;
    regexp = regexp.replace(inputReplyRE, (match, p1, p2) => {
      const index = p2 ? Number.parseInt(p2) : 0;
      return history[index][p1] ? history[index][p1].original : match;
    });
  }

  return regexp;
}
This function replaces syntax in the trigger such as:
<noun1> <adverb2> <pronoun2>
with the respective word in the user's message.

- `<basename>` gets replaced by `(replacements[0])`
- `<basenames>` gets replaced by `(replacements[0]|replacements[1]|...)`
- `<basenameN>` gets replaced by `(replacements[N])`

This function contains the user object so it may be contextual to this user.