Chaîne divisée en JavaScript en utilisant RegExp ignorant le délimiteur entre parenthèses

J'ai plusieurs instances de chaînes que je dois diviser. Voici quelques exemples et les scénarios de sortie souhaités. Les règles à diviser sont également répertoriées:

Exemple 1:

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

Exemple 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]' 

Exemple 3:

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

Les règles sont simples. Divisez la chaîne en utilisant '|' En tant que délimiteur seulement lorsqu'il n'apparaît pas dans les crochets. Remarque: la chaîne peut ne pas avoir de crochets. Il n'y a pas d'espaces dans les chaînes d'entrée.

Je recherche une solution en JavaScript car cela concerne un module node.js.

Ce regex devrait fonctionner pour les cas que vous avez décrits:

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

Voici un exemple de fonctionnement: http://jsfiddle.net/UFq3h/1/ (vous devrez ouvrir la console pour voir les résultats).

Explication brute: tout | Caractère non suivi de (caractères de mots ou | suivi de ] ). Si vous avez besoin d'une explication plus précise, postez un commentaire et je vais essayer de le préciser.

Edit: Merci à Lolo pour la version améliorée, qui gère le dernier exemple dans le cas d'utilisation.

Je ne peux pas penser à regex en ce moment, mais vous pouvez le faire:

 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);