-2
votes

Extraire JavaScript caractères à l'exclusion `:`

J'ai la chaîne de texte suivante:

Test: ABCDEGF: 18: 32 code> p>

Les lettres de ce texte varient, cela inclut également des chiffres. La cible consiste à extraire toutes les lettres et numéros hors : code> caractère. P>

jusqu'à présent, ce qui suit fonctionne pour moi: p>

lignes.split ( ":"); code> p>

jusqu'à ce que je sois trébuché sur une nouvelle exigence où nous devons extraire le temps aussi dans la forme complète 18:32 code> ce qui signifie que si j'utilise si j'utilise Un divisé code> ne me donnez que jusqu'à ce que 18 code> p>

Maintenant comment puis-je extraire cela, y compris la durée qui peut se produire parfois. P>

Exemples forts> P>

ABCDED: ERERE: 18: 32 CODE> P>

Résultat souhaité: P>

 temp.fields[0] = ABCDED
 temp.fields[1] = ERERE
 temp.fields[2] = 18:32 


11 commentaires

Ajoutez plus d'exemples de chaîne d'entrée et résultat de la sortie


Pour ajouter sur ce que @ Kamilkiełczewski a dit, existe-t-il des restrictions sur la manière et où l'heure peut apparaître avec un côlon?


Si vous ne connaissez pas le nombre d'éléments et à quel endroit le temps est, il n'est pas possible.


Comment êtes-vous censé distinguer un colon dans la chaîne vs un côlon comme séparateur


string.replace ()? Stackoverflow.com/Questtions/9932957/...


Je pense que ce que vous voulez faire est d'utiliser la longueur de tableau Array après sa production pour obtenir les derniers éléments de la matrice. Vous pouvez obtenir le dernier élément avec arr [arr.l.length-1] et le second vers le dernier élément avec arr [arr.l.length-2] . Cela vous donnera les deux valeurs pour le temps.


TEMPS: 18:32 a toujours lieu sur le dernier par exemple. champs [2] dans l'exemple


Oui, mais si vous utilisez Split (qui est l'une de vos seules options pour cela), il va également diviser vos informations de temps. Vous devriez utiliser arr.lthength-1 et arr.length-2 pour les valeurs respectives de la matrice, tout au cas où plus tard, vous voudrez peut-être ajouter plus d'informations divisées à la chaîne. .


Si cela ne se produit que exactement une fois et est-ce toujours le dernier élément que vous recherchez chaîne fractionnée avec limite, où la dernière chaîne contient le reste


possible de montrer des exemples s'il vous plaît


Comment vous serez sûr ou confiance, par exemple que "18:32" représente une heure et ne représente pas deux nombres séparés?


5 Réponses :


0
votes

Vous pouvez utiliser Remplacer pour modifier le délimiteur (: code>) partout sauf lorsqu'il est entre les chiffres. Quelque chose comme ceci:

p>

const data = "ABCDED:ERERE:18:32";

const arr = data.replace(/:/g, function(match, pos, str){
  const before = str.substring(pos - 2, pos);
  const after = str.substring(pos + 1, pos + 3);

  if(!isNaN(before) && !isNaN(after)){
    return match;
  }else {
    return "|";
  }
}).split("|");

console.log(arr);


1 commentaires

Ces types de hacks sont toujours vraiment fragiles et peuvent avoir des résultats étranges si vous ne pouviez pas penser à tous les cas de bord que vous pourriez avoir. Par exemple. Quelque chose comme ça AB12: 12DE: 12: 18: 32 aboutirait à ["ABCDED12: 12ERere", "12:18:32"]




2
votes

Si votre code> est toujours à la fin, vous pouvez faire quelque chose comme ça.

p>

function doIt(str) {
  var a = str.split(':');
  var b = a.splice(-2) //remove 2 last from a and save in b
    .join(':');
  a.push(b);
  return a;
}

console.log(doIt('TEST:ABCDEGF:18:32'));


0 commentaires

1
votes

Je l'ai résolu en utilisant: xxx

à partir du lien suivant:

chaîne fractionnée avec limite, où la dernière chaîne contient le reste

Ceci fonctionne comme je m'y attends.

Merci à T.Niese pour le partage et grâce à tous ceux qui ont répondu. Toutes ces réponses fonctionnent, mais dans le lien ci-dessus, c'était une solution simple. Malheureusement, je ne peux pas accepter toutes les réponses. Mais aimerais faire si si j'avais une option. +1 pour tous


2 commentaires

Je pense que la seule réponse fiable (étant donné que vous savez où se produit le fichier horaire), est à vous et à celui de Alex Kudryashev .


Qu'est-ce qui contient la variable pièces dans votre code? (Parce que je ne sais pas comment l'exécuter - si je place votre exemple de chaîne directement, cela ne fonctionne pas). Le deuxième problème est que la dernière opération que vous utilisez joindre - cela retournera la chaîne - non (comme vous décrivez en question)



0
votes

J'ai vu sur des commentaires que le temps semble toujours à la fin, voici ma deuxième réponse plus simple (texte dans s code>) xxx pre>

p>

let s="ABCDED:ERERE:18:32"

let fields =  [...s.slice(0,-6).split(':'), s.slice(-5)]; 

console.log(fields);


0 commentaires