Разбить строку в JavaScript с помощью RegExp, игнорируя разделитель в скобках - PullRequest
3 голосов
/ 12 декабря 2011

У меня есть различные экземпляры строк, которые мне нужно разделить. Ниже приведены некоторые примеры и желаемые выходные сценарии. Правила разделения также перечислены:

Пример 1:

input: 'filename.ext|someattributes'
output array: 
  'filename.ext', 
  'someattributes'

Пример 2:

input: qualifier1[filename.ext|someattributes]|qualifier2[another_filename.ext|some_other_attributes]
output array: 
  'qualifier1[filename.ext|someattributes]',
  'qualifier2[another_filename.ext|some_other_attributes]'

Пример 3:

input: dummyqualifier|qualifier1[filename.ext|someattributes]
output array: 
  'dummyqualifier', 
  'qualifier1[filename.ext|someattributes]'

Правила просты. Разбейте строку, используя '|' в качестве разделителя, только если он не указан в квадратных скобках. Примечание. Строка может не иметь квадратных скобок. Во входных строках нет пробелов.

Я ищу решение в JavaScript, так как это для модуля node.js.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Это регулярное выражение должно работать для описанных вами случаев:

/\|(?!(?:\w+\|?)+])/

Вот пример его выполнения: http://jsfiddle.net/UFq3h/1/ (вам нужно будет открыть консоль, чтобы увидеть результаты).

Грубое объяснение: любой | символ не , за которым следует (слова или | , за которыми следует ] ),Если вам нужно более точное объяснение, оставьте комментарий, и я постараюсь сделать его более понятным.

Редактировать: Спасибо Лоло за улучшенную версию, которая обрабатывает последний пример в случае использования.

1 голос
/ 12 декабря 2011

Я не могу сейчас думать о регулярных выражениях, но вы можете сделать это:

function doSplit(input) {
    var tmp = input.split('|');

    var result = [];
    for (var i = 0, j = 0; i < tmp.length; i++) {
        result[j] = (result[j] ? result[j] + '|' : '') + tmp[i];
        if (result[j].indexOf('[') == -1 || result[j].indexOf(']') != -1) {
            j++;
        }
    }

    return result;
}

var i = 'qualifier1[filename.ext|someattributes]|qualifier2[another_filename.ext|some_other_attributes]';
var o = doSplit(i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...