Есть 2 файла для редактирования, чтобы позволить CKAN реализовать «публичный адрес»
Регулярное выражение
[^\\],
означает «соответствует символу, который не является обратной косой чертой, за которым следует запятая» - вот почему такие шаблоны, как t,
совпадают, потому что t
является символом, который не является обратной косой чертой.
Я думаю, что вам нужно использовать какой-то негативный вид сзади , чтобы захватить ,
, которому не предшествует \
без захвата предыдущего символа, что-то вроде
(?<!\\),
(кстати, обратите внимание, что я намеренно не избежал двойной косой черты, чтобы сделать это более читабельным)
Попробуйте:
String array[] = str.split("(?<!\\\\),");
По сути это означает разделение на запятую, за исключением случаев, когда этой запятой предшествует две обратные косые черты. Это называется отрицательным взглядом за утверждением нулевой ширины .
. Для дальнейшего использования приведем полный метод, с которым я закончил:
public static String[] commaDelimitedListToStringArray(String str, String escapeChar) {
// these characters need to be escaped in a regular expression
String regularExpressionSpecialChars = "/.*+?|()[]{}\\";
String escapedEscapeChar = escapeChar;
// if the escape char for our comma separated list needs to be escaped
// for the regular expression, escape it using the \ char
if(regularExpressionSpecialChars.indexOf(escapeChar) != -1)
escapedEscapeChar = "\\" + escapeChar;
// see http://stackoverflow.com/questions/820172/how-to-split-a-comma-separated-string-while-ignoring-escaped-commas
String[] temp = str.split("(?<!" + escapedEscapeChar + "),", -1);
// remove the escapeChar for the end result
String[] result = new String[temp.length];
for(int i=0; i<temp.length; i++) {
result[i] = temp[i].replaceAll(escapedEscapeChar + ",", ",");
}
return result;
}