2010-10-07 3 views
0

j'ai une chaîne comme cedés une chaîne de caractères dans JS

4741:GREEN,CIRHOSIS,ORANGE,Long-term,GREEN,HIS B CHIC,4642:GREEN,CRHOSIS,GREEN,HSysk B CC, 

la piqûre contient deux enregistrements avec enregistrement ID 4741 et 4642 séparés par caractère. Aussi dans les enregistrements tout le reste est séparé par une virgule (,)

comment puis-je partager cette piqûre. Veuillez noter que cette chaîne d'exemple contient seulement 2 enregistrements mais les autres peuvent contenir plus ou moins ou aucun. Nous vous remercions de votre aide!

+0

Vous devez fournir le résultat souhaité pour plus de clarté. –

+0

ressemble à un travail pour Regex trouver le numéro devant un colon et ajouter une nouvelle ligne ou un autre caractère devant le numéro. Une fois que les enregistrements sont séparés, ils doivent être faciles à traiter – Roadie57

+0

Comment voulez-vous le diviser? – Detect

Répondre

3

idée de base:

var str = "4741:GREEN,CIRHOSIS,ORANGE,Long-term,GREEN,HIS B CHIC,4642:GREEN,CRHOSIS,GREEN,HSysk B CC,1111:asdf" 

var re = /(\d+):([^(\d+:)]+)/g; 

var matches = str.match(re); 

for(var x in matches){ 
    var parts = matches[x].split(":"); 
    var id = parts[0]; 
    var vals = parts[1].split(","); 
    alert(id + "\n" + vals.length); 
} 
+0

pouvez-vous me dire ce que cela fait var re =/(\ d +): ([^ (\ d +:)] +)/g; – Autolycus

+1

@ user295189: Si je ne me trompe pas: (\ d +) correspond à un groupe contenant 1 à N nombres, ([^ (\ d +:)] +) correspond à un groupe tant que vous n'atteignez pas une autre séquence suivi d'un point-virgule. – haylem

0
function split(str) { 
    var split = str.split(/,?(\w+):/); 
    var result = {}; 
    for (var i = 1; i < split.length; i+=2) { 
    result[split[i]] = split[i+1].split(/,/); 
    } 
    return result; 
} 
split("4741:GREEN,CIRHOSIS,ORANGE,Long-term,GREEN,HIS B CHIC,4642:GREEN,CRHOSIS,GREEN,HSysk B CC"); 
// => {'4642': ['GREEN', 'CRHOSIS', 'GREEN', 'HSysk B CC'], '4741': ['GREEN', 'CIRHOSIS', 'ORANGE', 'Long-term', 'GREEN', 'HIS B CHIC']} 
0

Vous pouvez utiliser la fonction String.match:

var records = "4741:GREEN,CIRHOSIS,ORANGE,Long-term,GREEN,HIS B CHIC,4642:GREEN,CRHOSIS,GREEN,HSysk B CC," 
var regex = /[0-9]+:([a-zA-Z0-9]*,)+/gi; 
records.match(regex); 

Résultat: ["4741:GREEN,CIRHOSIS,ORANGE,", "4642:GREEN,CRHOSIS,GREEN,"]

Si vous cherchez quelque chose de plus vous précis devra prolonger votre question.

Une autre chose intéressante à faire peut être d'ajouter des accolades, des crochets et des guillemets à la chaîne, puis JSON.parse() it.

2

Utilisez ceci:

var source = "4741:GREEN,CIRHOSIS,ORANGE,Long-term,GREEN,HIS B CHIC,4642:GREEN,CRHOSIS,GREEN,HSysk B CC,4643:GREEN,CRHOSIS,GREEN,HSysk B CC,4644:GREEN,CRHOSIS,GREEN,HSysk B CC,4645:GREEN,CRHOSIS,GREEN,HSysk B CC,4646:GREEN,CRHOSIS,GREEN,HSysk B CC,"; 

var extractRecordsAsArray = function (source) { 
    var records = []; 

    if (source && source.split) { // is string 
    var re  = new RegExp("[0-9]+:[^0-9:]+", "g"); 
    var entries = source.match(re); 

    for (var i = 0, len = entries.length; i < len; i++) { 
     var entry = entries[i].split(':'); 

     records.push([entry[0], entry[1].split(',')]); 
    } 
    } 
    return (records); 
}; 

console.log("records: %o", extractRecordsAsArray(source)); 

Ou si vous préférez une carte pour le stockage:

var extractRecordsAsMap = function (source) { 
    var records = {}; 

    if (source && source.split) { // is string 
    var re  = new RegExp("[0-9]+:[^0-9:]+", "g"); 
    var entries = source.match(re); 

    for (var i = 0, len = entries.length; i < len; i++) { 
     var entry = entries[i].split(':'); 

     records[entry[0]] = entry[1].split(','); 
    } 
    } 
    return (records); 
}; 

console.log("records: %o", extractRecordsAsMap(source)); 

épreuve des balles non garantie et d'être le plus efficace, mais permettra d'atteindre des performances décentes pour assez grandes chaînes et fonctionne bien.

Questions connexes