package org.jabref.logic.util.strings; /** * A String tokenizer that works just like StringTokenizer, but considers quoted * characters (which do not act as delimiters). */ public class QuotedStringTokenizer { private final String content; private final int contentLength; private final String delimiters; private final char quoteChar; private int index; /** * @param content * The String to be tokenized. * @param delimiters * The delimiter characters. * @param quoteCharacter * The quoting character. Every character (including, but not * limited to, delimiters) that is preceded by this character is * not treated as a delimiter, but as a token component. */ public QuotedStringTokenizer(String content, String delimiters, char quoteCharacter) { this.content = content; this.delimiters = delimiters; quoteChar = quoteCharacter; contentLength = this.content.length(); // skip leading delimiters while (isDelimiter(this.content.charAt(index)) && index < contentLength) { ++index; } } public String nextToken() { char c; StringBuilder stringBuilder = new StringBuilder(); while (index < contentLength) { c = content.charAt(index); if (c == quoteChar) { // next is quoted ++index; if (index < contentLength) { stringBuilder.append(content.charAt(index)); // ignore for delimiter search! } } else if (isDelimiter(c)) { // unit finished // advance index until next token or end ++index; return stringBuilder.toString(); } else { stringBuilder.append(c); } ++index; } return stringBuilder.toString(); } private boolean isDelimiter(char c) { return delimiters.indexOf(c) >= 0; } public boolean hasMoreTokens() { return index < contentLength; } }