X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Futil%2FStringUtils.java;h=cc51d072ccc3968e01bf9a75bf78679bf582f2ee;hb=a9177efb4097815d9a8031aa22700c61a7d6260a;hp=9212c8e4ab31ecf859eeeac1f8eff48cb93597c0;hpb=3b65a96203737c2ace58b1205e0056508e9dbff3;p=jalview.git diff --git a/src/jalview/util/StringUtils.java b/src/jalview/util/StringUtils.java index 9212c8e..cc51d07 100644 --- a/src/jalview/util/StringUtils.java +++ b/src/jalview/util/StringUtils.java @@ -25,13 +25,9 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.regex.Pattern; public class StringUtils { - private static final Pattern DELIMITERS_PATTERN = Pattern - .compile(".*='[^']*(?!')"); - private static final char PERCENT = '%'; private static final boolean DEBUG = false; @@ -144,6 +140,7 @@ public class StringUtils * Parses the input string into components separated by the delimiter. Unlike * String.split(), this method will ignore occurrences of the delimiter which * are nested within single quotes in name-value pair values, e.g. a='b,c'. + * New implementation to avoid Pattern for jalviewjs. * * @param input * @param delimiter @@ -152,72 +149,54 @@ public class StringUtils public static String[] separatorListToArray(String input, String delimiter) { - int seplen = delimiter.length(); - if (input == null || input.equals("") || input.equals(delimiter)) + if (input == null + // these two shouldn't return null (one or two "" respectively) + || input.equals("") || input.equals(delimiter)) { return null; } - List jv = new ArrayList<>(); - int cp = 0, pos, escape; - boolean wasescaped = false, wasquoted = false; - String lstitem = null; - while ((pos = input.indexOf(delimiter, cp)) >= cp) + + final char escapeChar = '\\'; + final char quoteChar = '\''; + int ilength = input.length(); + int dlength = delimiter.length(); + List values = new ArrayList<>(); + + boolean escape = false; + boolean inquote = false; + + int start = 0; + for (int i = 0; i < ilength; i++) { - escape = (pos > 0 && input.charAt(pos - 1) == '\\') ? -1 : 0; - if (wasescaped || wasquoted) - { - // append to previous pos - jv.set(jv.size() - 1, lstitem = lstitem + delimiter - + input.substring(cp, pos + escape)); - } - else + if (!escape && !inquote && ilength >= i + dlength + && input.substring(i, i + dlength).equals(delimiter)) { - jv.add(lstitem = input.substring(cp, pos + escape)); + // found a delimiter + values.add(input.substring(start, i)); + i += dlength; + start = i; + continue; } - cp = pos + seplen; - wasescaped = escape == -1; - // last separator may be in an unmatched quote - // private static final Pattern DELIMITERS_PATTERN = - // Pattern.compile(".*='[^']*(?!')"); - wasquoted = DELIMITERS_PATTERN.matcher(lstitem).matches(); - } - if (cp < input.length()) - { - String c = input.substring(cp); - if (wasescaped || wasquoted) + char c = input.charAt(i); + if (c == escapeChar) { - // append final separator - jv.set(jv.size() - 1, lstitem + delimiter + c); + escape = !escape; + continue; } - else + if (escape) { - if (!c.equals(delimiter)) - { - jv.add(c); - } + escape = false; + continue; } - } - if (jv.size() > 0) - { - String[] v = jv.toArray(new String[jv.size()]); - jv.clear(); - if (DEBUG) + if (c == quoteChar) { - jalview.bin.Console.errPrintln("Array from '" + delimiter - + "' separated List:\n" + v.length); - for (int i = 0; i < v.length; i++) - { - jalview.bin.Console.errPrintln("item " + i + " '" + v[i] + "'"); - } + inquote = !inquote; } - return v; } - if (DEBUG) - { - jalview.bin.Console.errPrintln( - "Empty Array from '" + delimiter + "' separated List"); - } - return null; + // add the last value + values.add(input.substring(start, ilength)); + + return values.toArray(new String[values.size()]); } /**