class DutchWordTokenizer extends WordTokenizer {

  private static final List<String> QUOTES = Arrays.asList("'", "`", "’",  "‘", "´");

  private final String nlTokenizingChars;

  public DutchWordTokenizer() {
    //remove the apostrophe etc. from the standard tokenizing characters:
    String chars = super.getTokenizingCharacters() + "_";
    for (String quote : QUOTES) {
      chars = chars.replace(quote, "");
    }
    nlTokenizingChars = chars;
  }

  /**
   * Tokenizes just like WordTokenizer with the exception for words such as
   * "oma's" that contain an apostrophe in their middle.
   * @param text Text to tokenize
   * @return List of tokens
   */
  @Override
  public List<String> tokenize(final String text) {<FILL_FUNCTION_BODY>}

  private boolean startsWithQuote(String token) {
    for (String quote : QUOTES) {
      if (token.startsWith(quote)) {
        return true;
      }
    }
    return false;
  }

  private boolean endsWithQuote(String token) {
    for (String quote : QUOTES) {
      if (token.endsWith(quote)) {
        return true;
      }
    }
    return false;
  }

  @Override
  public String getTokenizingCharacters() {
    return nlTokenizingChars;
  }
}

    final List<String> l = new ArrayList<>();
    final StringTokenizer st = new StringTokenizer(text, nlTokenizingChars, true);
    while (st.hasMoreElements()) {
      String token = st.nextToken();
      String origToken = token;
      if (token.length() > 1) {
        if (startsWithQuote(token) && endsWithQuote(token) && token.length() > 2) {
          l.add(token.substring(0, 1));
          l.add(token.substring(1, token.length()-1));
          l.add(token.substring(token.length()-1));
        } else if (endsWithQuote(token)) {
          int cnt = 0;
          while (endsWithQuote(token)) {
            token = token.substring(0, token.length() - 1);
            cnt++;
          }
          l.add(token);
          for (int i = origToken.length() - cnt; i < origToken.length(); i++) {
            l.add(origToken.substring(i, i + 1));
          }
        } else if (startsWithQuote(token)) {
          while (startsWithQuote(token)) {
            l.add(token.substring(0, 1));
            token = token.substring(1);
          }
          l.add(token);
        } else {
          l.add(token);
        }
      } else {
        l.add(token);
      }
    }
    return joinEMailsAndUrls(l);
  
<methods>public non-sealed void <init>() ,public static List<java.lang.String> getProtocols() ,public java.lang.String getTokenizingCharacters() ,public boolean isCurrencyExpression(java.lang.String) ,public static boolean isEMail(java.lang.String) ,public static boolean isUrl(java.lang.String) ,public List<java.lang.String> replaceEmojis(java.lang.String) ,public List<java.lang.String> restoreEmojis(List<java.lang.String>, List<java.lang.String>) ,public List<java.lang.String> splitCurrencyExpression(java.lang.String) ,public List<java.lang.String> tokenize(java.lang.String) <variables>private static final java.util.regex.Pattern CURRENCY_EXPRESSION,private static final java.util.regex.Pattern CURRENCY_SYMBOLS,private static final java.util.regex.Pattern CURRENCY_VALUE,private static final java.util.regex.Pattern DOMAIN_CHARS,private static final java.util.regex.Pattern E_MAIL,private static final java.util.regex.Pattern NO_PROTOCOL_URL,private static final List<java.lang.String> PROTOCOLS,protected final java.lang.String REMOVED_EMOJI,private static final java.lang.String TOKENIZING_CHARACTERS,private static final java.util.regex.Pattern URL_CHARS