Разделяемая запятая Regex, кроме экранированных [дубликатов]

Это легко объясняется:

  1. Объявление функции (класс и т. д.) выполняется только один раз, создавая все объекты значения по умолчанию
  2. , все передается по ссылке

Итак:

def x(a=0, b=[], c=[], d=0):
    a = a + 1
    b = b + [1]
    c.append(1)
    print a, b, c
  1. a не изменяется - каждый вызов назначения создает новый объект int - печатается новый объект
  2. b не изменяется - новый массив создается из значения по умолчанию и печатается
  3. c изменения - операция выполняется на одном и том же объекте - и печатается
9
задан pimvdb 7 September 2011 в 08:28
поделиться

5 ответов

Вы можете использовать regex для разделения.

Вот ссылка на регулярное выражение в javascript http://www.w3schools.com/jsref/jsref_obj_regexp.asp

Вот ссылка на другую запись, в которой автор использовал regex для split Javascript не будет разбиваться с использованием regex

. Из первой ссылки, если вы заметили, может создавать регулярное выражение, используя

?! n Соответствует любой строке, за которой не следует определенная строка n

[,]!\\
12
ответ дан Community 21 August 2018 в 17:00
поделиться
  • 1
    Конечно, вы можете использовать регулярное выражение для разделения строки. Вопрос: КАК разбить строку так, как просил автор. – WTK 7 September 2011 в 08:05
  • 2
    Да, это не то, чего хочет автор. Я думаю, что нужно перебирать петлю с каждым ее разделом запятыми и проверять, что предыдущая каждая часть имеет или нет. / & Quot; в конце ... Если это так, – GoRoS 7 September 2011 в 08:08
  • 3
    @WTK Первое звено охватило ответ, просто не захотелось ложного кормления. Вы снова отредактировали ответ, чтобы включить больше информации, основанной на ваших предложениях, хотя – Rahul Choudhary 7 September 2011 в 08:12
  • 4
    @ GoRoS, можете ли вы написать точную функцию для вас? – Ovi 7 September 2011 в 08:17
  • 5
    Спасибо, почему вы используете ~? – Ovi 7 September 2011 в 08:20
  • 6
    Вы можете использовать что-либо вместо ~. Он должен быть чем-то (даже чем-то длиннее, чем ~), что вы уверены, что не появится в цепочке, которая разделяется, потому что на следующем шаге (после замены) мы разделим строку, используя этот символ (ы). – WTK 7 September 2011 в 08:22
  • 7
    Я рекомендую использовать любой непечатаемый символ вместо ~. Например. это может быть \ u000B, что соответствует коду нулевой ширины. – Eskat0n 7 September 2011 в 08:22
  • 8
    Не сделал ничего – Ovi 7 September 2011 в 08:26
  • 9
    Да, я тоже хотел бы это увидеть. Обратите внимание, что ссылка, представленная в первом комментарии, ссылалась на Java, которая имеет различную реализацию регулярного выражения. – WTK 7 September 2011 в 08:28
  • 10
    Что ничего не делало? :) Обратите внимание, что обратные косые черты перед двоеточиями должны быть экранированы , используя другую обратную косую черту. В противном случае javascript обрабатывает форму \, как экранированную двоеточие и производит из нее просто двоеточие! Другими словами, если вы не избежите обратной косой черты, javascript видит это: a\,bcde,fgh,ijk\,lmno,pqrst\,uv как это a,bcde,fgh,ijk,lmno,pqrst,uv. – WTK 7 September 2011 в 08:30
11
ответ дан Community 1 November 2018 в 10:02
поделиться

В случае необходимости также удалить обратную косую черту:

var test='a\\.b.c';
var result = test.replace(/\\?\./g, function (t) { return t == '.' ? '\u000B' : '.'; }).split('\u000B');
//result: ["a.b", "c"]
0
ответ дан Gene R 21 August 2018 в 17:00
поделиться

Поскольку регулярные выражения в JavaScript не поддерживают lookbehinds , я не собираюсь готовить гигантский взлом, чтобы имитировать это поведение. Вместо этого вы можете просто split() на всех запятых (,), а затем приклеить фрагменты, которые не должны были быть разделены в первую очередь.

Quick 'n' dirty demo :

var str = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv'.split(','), // Split on all commas
    out = []; // Output

for (var i = 0, j = str.length - 1; i < j; i++) { // Iterate all but last (last can never be glued to non-existing next)
    var curr = str[i]; // This piece
    if (curr.charAt(curr.length - 1) == '\\') { // If ends with \ ...
        curr += ',' + str[++i]; // ... glue with next and skip next (increment i)
    }
    out.push(curr); // Add to output
}
3
ответ дан jensgram 21 August 2018 в 17:00
поделиться
  • 1
    Я думаю, что это решение выглядит очень большим обходным решением, в то время как есть решение, представленное WTK – Eskat0n 7 September 2011 в 08:25
  • 2
    @ Eskat0n Действительно, это есть обходной путь ... обходной путь, который случается, охватывает больше строк, чем другие ответы :) – jensgram 7 September 2011 в 08:40
  • 3
    Это решение выходит из строя, если у вас есть несколько экранированных ',' перед тем, как не сбежать ','. НАПРИМЕР. "ab\\,c\\,ed,fg". Изменить: for (var i = 0, j = str.length - 1; i < j; i++) { на: while (var i = 0, j = str.length - 1; i < j; i++) {, чтобы исправить эту проблему. – DLKJ 9 September 2013 в 12:36

Еще один уродливый хак вокруг отсутствия задержек:

function rev(s) {
    return s.split('').reverse().join('');
}

var s = 'a\\,bcde,fgh,ijk\\,lmno,pqrst\\,uv';

// Enter bizarro world...
var r = rev(s);

// Split with a look-ahead
var rparts = r.split(/,(?!\\)/);

// And put it back together with double reversing.
var sparts = [ ];
while(rparts.length)
    sparts.push(rev(rparts.pop()));

for(var i = 0; i < sparts.length; ++i)
    $('#out').append('<pre>' + sparts[i] + '</pre>');

Демо: http://jsfiddle.net/ambiguous/QbBfw/1/

Я не думаю, что сделаю это в реальной жизни, но это работает, даже если это заставляет меня чувствовать себя грязным. Считайте это любопытством, а не тем, что вы действительно должны использовать.

1
ответ дан mu is too short 21 August 2018 в 17:00
поделиться
Другие вопросы по тегам:

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