То, как разделить запятую, разделило Строку, в то время как игнорирование вышло из запятых?

Есть 2 файла для редактирования, чтобы позволить CKAN реализовать «публичный адрес»

  1. ckan.site_url в production.ini
  2. CKAN_SITE_URL в .env
  3. [ 112]
26
задан arturh 4 May 2009 в 19:33
поделиться

3 ответа

Регулярное выражение

[^\\],

означает «соответствует символу, который не является обратной косой чертой, за которым следует запятая» - вот почему такие шаблоны, как t, совпадают, потому что t является символом, который не является обратной косой чертой.

Я думаю, что вам нужно использовать какой-то негативный вид сзади , чтобы захватить , , которому не предшествует \ без захвата предыдущего символа, что-то вроде

(?<!\\),

(кстати, обратите внимание, что я намеренно не избежал двойной косой черты, чтобы сделать это более читабельным)

32
ответ дан 28 November 2019 в 06:28
поделиться

Попробуйте:

String array[] = str.split("(?<!\\\\),");

По сути это означает разделение на запятую, за исключением случаев, когда этой запятой предшествует две обратные косые черты. Это называется отрицательным взглядом за утверждением нулевой ширины .

30
ответ дан 28 November 2019 в 06:28
поделиться

. Для дальнейшего использования приведем полный метод, с которым я закончил:

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;
}
6
ответ дан 28 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: