J'ai la chaîne de texte suivante:
Les lettres de ce texte varient, cela inclut également des chiffres. La cible consiste à extraire toutes les lettres et numéros hors jusqu'à présent, ce qui suit fonctionne pour moi: p> jusqu'à ce que je sois trébuché sur une nouvelle exigence où nous devons extraire le temps aussi dans la forme complète Maintenant comment puis-je extraire cela, y compris la durée qui peut se produire parfois. P> Exemples forts> P> Résultat souhaité: P> Test: ABCDEGF: 18: 32 code> p> : code> caractère. P> lignes.split ( ":"); code> p> 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> ABCDED: ERERE: 18: 32 CODE> P> temp.fields[0] = ABCDED
temp.fields[1] = ERERE
temp.fields[2] = 18:32
5 Réponses :
Vous pouvez utiliser Remplacer pour modifier le délimiteur ( p> : code>) partout sauf lorsqu'il est entre les chiffres. Quelque chose comme ceci: 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);
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 code> aboutirait à ["ABCDED12: 12ERere", "12:18:32"] code>
Essayez ceci
p>
let str = `TEST:ABCDEGF:18:32:aa:12:BCB:11:12:AAA`;
let m = str.replace(/(\d\d\:\d\d)|\:/g,"$1 ").replace(/ +/g,' ').split(' ');
console.log(m);Ceci a l'air bien qu'il est possible d'expliquer les expressions de régions
Merci Bro, c'est très apprécié.
Ne semble pas vraiment fiable pour moi 54:12 code> n'est pas une heure valide, que si la colonne avec aa code> ou BCD code> contient un numéro de deux chiffres ? Et il brûle une lettre supplémentaire qui ne peut plus être utilisée.
@ T.Niese Je suppose que les données d'entrée sont valides (je corrige ce bug de données dans l'exemple utilisé dans ma réponse). La validation peut être effectuée avant ou après la fractionnement, mais la validation du temps est hors de portée de cette question et peut être trouvée par exemple. ici
@ T.Niese Si vous remplacez aa code> ou BCD code> à 2 chiffres, la chaîne est invalide. Vous ne pouvez pas déterminer sans ambiguïté quels chiffres contiennent une heure. Comme j'écris dans le dernier commentaire, je suppose que la chaîne est valide car op non mentionne que cela peut être invalide, la validation des données n'est pas hors de la portée de cette question. Expliquer plus sur "lettre supplémentaire" (sur votre dernière phrase de commentaire) - parce que je ne comprends pas où est le problème
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')); Je l'ai résolu en utilisant: à partir du lien suivant: p> chaîne fractionnée avec limite, où la dernière chaîne contient le reste p>
blockQuote> Ceci fonctionne comme je m'y attends. P> Merci à
T.Niese code> 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 p> p>
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 code> pièces code> 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 code> - cela retournera la chaîne - non (comme vous décrivez en question)
J'ai vu sur des commentaires que le temps semble toujours à la fin, voici ma deuxième réponse plus simple (texte dans p>
s code>) let s="ABCDED:ERERE:18:32"
let fields = [...s.slice(0,-6).split(':'), s.slice(-5)];
console.log(fields);
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 code> après sa production pour obtenir les derniers éléments de la matrice. Vous pouvez obtenir le dernier élément avecarr [arr.l.length-1] code> et le second vers le dernier élément avecarr [arr.l.length-2] code>. Cela vous donnera les deux valeurs pour le temps.TEMPS:
18:32 Code> a toujours lieu sur le dernier par exemple.champs [2] code> dans l'exempleOui, 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 code> etarr.length-2 code> 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 a>
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?