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
4 Réponses :
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);
\ 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 ...
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);
Pour obtenir le résultat attendu, utilisez l'option ci-dessous avec remplacer, diviser et découper
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
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);
Mais j'ai plutôt:comme dansMais 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