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