2
votes

Valeurs du tableau Concat

J'ai cette chaîne:

Item 1Item 2Item 3Item 4Item NItem N-1

Je veux obtenir:

var string = 'Item 1Item 2Item 3Item 4'
var regex = string.split(/(\d)/)
regex.splice(-1, 1)
regex[regex.length - 2] += regex[regex.length - 1];
regex.splice(-1, 1)
console.log(regex);

J'ai essayé de faire ceci:

["Item 1", "Item 2", "Item 3", "Item 4"]

Mais ça ne marche pas, aucune idée comment obtenir le résultat souhaité?

EDIT:

La chaîne au max pourrait ressembler à ceci: p>

Item 1Item 2Item 3Item 4


6 commentaires

Mais j'ai plutôt: comme dans Mais je préfère obtenir: ?


Est-ce la seule chaîne pour laquelle cela doit fonctionner ou y a-t-il plus de cas?


@treyBake désolé pour la confusion - a mis à jour la question pour être plus claire.


Utilisez string.split (/ (?! ^) (? = Item) /)


@JamesCoyle a mis à jour la réponse pour ajouter un autre exemple.


. {6} est assez simple


4 Réponses :


10
votes

Remarque: la réponse gère le cas d'origine - avant la mise à jour

Utilisez String.match () pour trouver une séquence de non-nombres qui se termine par une séquence de nombres ( regex101 ):

var string = 'Item 1Item 2Item 3Item 4'
var arr = string.match(/\D+\d+/g)
console.log(arr);


7 commentaires

\ d -> \ d + c'est mieux


Et si la chaîne ressemble à ceci Item 1Item 2Item 3Item 4Item NItem N-1 ?


@IslamElshobokshy pour être clair, avez-vous réellement "Item N" ou "Item N-1" dans votre chaîne, ou est < code> "N" et "N-1" juste un espace réservé pour une séquence arbitraire de chiffres. (Vous devez utiliser un langage très précis lorsque vous discutez des expressions régulières).


@ p.s.w.g ce sont en fait des chaînes ou je l'aurais mentionné, mais vous avez tout à fait raison, j'avais besoin de clarifier.


Je l'ai vu, mais l'autre exemple que j'ai donné a la chaîne Item NItem N-1 , et ce ne sont pas des nombres ^^ Alors je peux utiliser / \ D + | N + | N \ -1 + / g ?


Item N ne se termine pas par un nombre :-) Ou j'aurais arrêté de vous déranger :-P


@IslamElshobokshy - parfois vous commencez sur une certaine piste, et après une mise à jour ...



3
votes

Si vos éléments commencent toujours par le mot Item , vous pouvez faire quelque chose comme ça en utilisant split () :

const str = 'Item 1Item 2Item 3Item 4Item 999Item N-2Item N-1Item N'
var arr = str.match(/Item\s[1-9|N|-]+/g);
console.log(arr);

Encore mieux, et vous pouvez également le faire avec une seule expression régulière en utilisant match ()

const str = 'Item 1Item 2Item 3Item 4Item N-2Item N-1Item N'
var arr = str.split("I").slice(1).map(x => "I" + x);
console.log(arr);


0 commentaires

0
votes

Pour obtenir le résultat attendu, utilisez l'option ci-dessous avec remplacer, diviser et découper

  1. Ajoutez un double espace avant "I" en utilisant replace
  2. Fractionner par double espace en utilisant split ('')
  3. supprimer la première chaîne vide à l'aide de la tranche (1)

var str = "Item 1Item 2Item 3Item 4Item NItem N-1"

let arr = str.replace(/\I/g, '  I').split('  ').slice(1);

console.log(arr)

codepen - https://codepen.io/nagasai/pen / qLzKwJ? editors = 1010


0 commentaires

5
votes

Lorsque vous avez un groupe de capture ( (...) ) dans l'expression régulière que vous passez à .split , le texte capturé est renvoyé dans le cadre du résultat. C'est pourquoi vous avez les "1" , "2" , etc. entre les "Item" .

A part à partir d'une variante de la solution @Ori Dori , vous pouvez également résoudre ce problème avec une assertion lookahead (? = ...) , qui est une construction non capturante. p >

var string = 'Item 1Item 2Item 3Item 4Item NItem N-1';
var arr = [];
var i = string.indexOf('Item', 1);
while (i >= 0) {
  arr.push(string.substr(0, i));
  string = string.substr(i);
  i = string.indexOf('Item', 1);
}
arr.push(string);
console.log(arr);

Cela fonctionnera en brisant la chaîne juste avant toute apparition du texte "Item".


Pour une solution plus brutale sans utiliser de regex du tout:

var string = 'Item 1Item 2Item 3Item 4Item NItem N-1';
var arr = string.split(/(?=Item)/);
console.log(arr);


0 commentaires