package org.jabref.model.search.rules; import java.util.ArrayList; import java.util.List; public class SentenceAnalyzer { public static final char ESCAPE_CHAR = '\\'; public static final char QUOTE_CHAR = '"'; private final String query; public SentenceAnalyzer(String query) { this.query = query; } public List<String> getWords() { List<String> result = new ArrayList<>(); StringBuilder stringBuilder = new StringBuilder(); boolean escaped = false; boolean quoted = false; for (char c : query.toCharArray()) { // Check if we are entering an escape sequence: if (!escaped && c == ESCAPE_CHAR) { escaped = true; } else { // See if we have reached the end of a word: if (!escaped && !quoted && Character.isWhitespace(c)) { if (stringBuilder.length() > 0) { result.add(stringBuilder.toString()); stringBuilder = new StringBuilder(); } } else if (c == QUOTE_CHAR) { // Whether it is a start or end quote, store the current // word if any: if (stringBuilder.length() > 0) { result.add(stringBuilder.toString()); stringBuilder = new StringBuilder(); } quoted = !quoted; } else { // All other possibilities exhausted, we add the char to // the current word: stringBuilder.append(c); } escaped = false; } } // Finished with the loop. If we have a current word, add it: if (stringBuilder.length() > 0) { result.add(stringBuilder.toString()); } return result; } }