J'ai un tableau de chaînes qui ressemble à ce qui suit:

const stringArray = [
    'string1[1] string2[2] string3[3] [4 5]',
    'string6[6] string7[7] string8[8] [9 10]'
];

Je veux pouvoir séparer chaque chaîne en quatre lignes (dans ce cas, car il y a 4 colonnes). Donc, le tableau finirait comme:

const splittedArray = [
    [
        'string1[1]',
        'string2[2]',
        'string3[3]',
        '[4 5]'
    ],
    [
        'string6[6]',
        'string7[7]',
        'string8[8]',
        '[9 10]'
    ]
]

J'ai cherché et essayé des regex même si je n'en suis pas fan car il est illisible, mais cela ne semble pas fonctionner.

Chaque fois que j'essaye /(?=\])\s/g, cela ne sépare pas la chaîne, chaque fois que j'essaye /(?=\])\s*/, il sépare la chaîne et garde à la fois le ] et le whitespace, mais le fait dans le prochain ligne (et bien, garde l'espace blanc) .

Je n'arrive pas à trouver un moyen de faire ce que je veux, mais peut-être me manque-t-il de comprendre quelque chose. Il existe peut-être un moyen plus simple de le faire. Séparer après le ] sans avoir besoin de vérifier un espace serait idéal, mais j'aurais toujours le problème de garder le crochet et de ne pas partager un temps supplémentaire sur ce dernier ], d'où la raison pour laquelle j'essaye ceci Solution.

Voici un petit snipper de code avec ce que j'ai et ce qu'il renvoie:

const stringArray = [
  'string1[1] string2[2] string3[3] [4 5]',
  'string6[6] string7[7] string8[8] [9 10]'
];

const splittedStringArray = stringArray.map(string => string.split(/(?=\])\s/g));

console.log(splittedStringArray);

const anotherSplittedStringArray = stringArray.map(string => string.split(/(?=\])\s*/g));

console.log(anotherSplittedStringArray);

const splittedByBrackets = stringArray.map(string => string.split(/(?=\])/));

// The same as the previous one
console.log(splittedByBrackets);

Pour mon cas, la réponse était: /\w*\[.*?\]/g (avec correspondance au lieu de division) par Thomas. D'après ce que j'ai compris:

Le \w* correspond à n'importe quel mot (0 fois ou plus)

Le \[ correspond au [ après un mot (ou aucun mot, au-dessus de la condition)

Le .*? correspond à n'importe quel caractère à l'exclusion des sauts de ligne (0 fois ou plus) paresseusement, je crois que le ? est de dire d'arrêter la correspondance sur le (s) premier (s) caractère (s) sinon il rechercherait toute la chaîne.

Le \] correspond au ] après ce qui se trouve après l'autre crochet (qui est la condition ci-dessus) .

L'indicateur /g fait en sorte qu'il recherche plus d'une occurrence.

0
Gustavo Vieira 2 juin 2020 à 14:01

3 réponses

Meilleure réponse

Au lieu de diviser par ce que vous ne voulez pas, vous pouvez également faire correspondre les parties que vous voulez.

const stringArray = [
  'string1[1] string2[2] string3[3] [4 5]',
  'string6[6] string7[7] string8[8] [9 10]'
];

const splittedStringArray = stringArray.map(string => string.match(/\w*\[.*?\]/g));

console.log(splittedStringArray);
0
Thomas 2 juin 2020 à 11:19

Utilisation de l'anticipation négative

\s(?![^\[]*\])

Démo Regex

const stringArray = [
  'string1[1] string2[2] string3[3] [4 5]',
  'string6[6] string7[7] string8[8] [9 10]'
];

const splittedStringArray = stringArray.map(string => string.split(/\s(?![^\[]*\])/g));

console.log(splittedStringArray);
0
User863 2 juin 2020 à 11:09

Vous pouvez jeter un regard positif en arrière pour une parenthèse fermante.

const stringArray = [
  'string1[1] string2[2] string3[3] [4 5]',
  'string6[6] string7[7] string8[8] [9 10]'
];

const splittedStringArray = stringArray.map(string => string.split(/(?<=\])\s/g));

console.log(splittedStringArray);
2
Nina Scholz 2 juin 2020 à 11:13