2017-04-12 3 views
1

J'ai mon script J'ai besoin de séparer une chaîne à partir du tableau de bord/trait d'union. Et assignez chaque pièce à une variable.Chaîne fractionnée seulement en un seul point

Exemple:

Blue Oyster Cult - Don't Fear The Reaper 
Jimi Hendrix - Come On (Let The Good Times Roll) 
Molly Hatchet - Dreams I'll Never See 

Je pense que regex peut le faire avec [\-]+ mais je suis à la recherche d'une méthode qui ne fait pas plus de deux variables. Donc quelle que soit la chaîne, le résultat doit être en deux parties seulement. Je pense que la meilleure approche est de considérer seulement le premier - (trait d'union) dans la chaîne.

Une idée de comment y parvenir?

Merci d'avance.

+3

String.prototype.split – yBrodsky

+1

Dans les deux '' Java' et Javascript', pour Strings il y a une fonction 'indexOf()' qui prend les arguments comme séparateur caractère/chaîne et renvoie le tableau.Avec 'indexOf' vous pouvez trouver la première occurence du '-' et donc vous pouvez obtenir' substring' Exemple: https://www.w3schools.com/jsref/jsref_split.asp –

+0

@OmSao Merci pour votre commentaire. Le problème avec split est qu'il fait le tableau de n'importe quelle instance du personnage. Ainsi, par exemple, s'il y a 2 traits d'union dans une chaîne, la longueur du tableau sera 3. Alors que je cherche une solution qui ne cherche que la première instance et laisse le reste dans le second élément du tableau. – DannyBoy

Répondre

5

Il suffit de faire .split(/-(.+)/)

Fractionnement par -(.+) le groupe correspondant (.+) vous aidera à obtenir le deuxième groupe dont vous avez besoin dans son intégralité - depuis .+ va consommer tous les caractères après la première - jusqu'à la fin de la ligne:

var text = "Hello world - This is super - easy and cool"; 
 

 
var parts = text.split(/-(.+)/); 
 

 

 
console.log( parts[0].trim() );  // "Hello world" 
 
console.log( parts[1].trim() );  // "This is super - easy and cool"

P.S: notez que ci-dessus j'utilise .trim() juste pour se débarrasser de l'emballage des chaînes espaces pour la simplicité regex et démo! ... Bien que si parts[1] ne renvoie rien (undefined) vous obtiendrez une erreur. Il faut donc utiliser à bon escient - ou développer l'expression rationnelle pour tenir compte des espaces blancs en option avant et après le séparateur - avec \s?

var text = "Hello world - This is super - easy and cool"; 
 

 
var parts = text.split(/\s?-\s?(.+)/); 
 

 

 
console.log( parts[0] );  // "Hello world" 
 
console.log( parts[1] );  // "This is super - easy and cool"

+1

C'est une bonne réponse, mais ce n'est pas l'argument 'limit' qui le fait fonctionner, c'est l'astucieux RegExp. Si vous supprimez l'argument '2' cela fonctionne toujours, mais' parts' aura un troisième élément de chaîne vide quand plus d'un '-' est présent. (Personnellement, je ferais juste 'var [artiste, titre] = text.split (/-(.+)?/);'.) –

+0

@Jordan répond bien. Bien que d'autres réponses soient bonnes et fonctionnent, je choisirais la vôtre car c'est très efficace. Vous pouvez donc le soumettre en réponse. – DannyBoy

+2

@DannyBoy Comme je l'ai dit, la magie est dans le RegExp, qui est 100% du travail de Roko. Vous devriez accepter sa réponse, et s'il veut intégrer ma suggestion, il devrait se sentir libre. –

3

Ici vous allez !!

<script> 
 
function myFunction() { 
 
    var str = "Hello world-welome to the-universe welcome."; 
 
    var n = str.indexOf("-"); 
 
    var str1 = str.substring(0,str.indexOf("-")); 
 
    var str2 = str.substring(str.indexOf("-")+1); 
 
    document.getElementById("demo").innerHTML = str1 + "<br>" + str2; 
 
} 
 
</script> 
 

 

 
<button onclick="myFunction()">Try it</button> 
 

 
<p id="demo"></p>

2

chaîne r var = "string - avec beaucoup - traits d'union";

var firstIndex = string.indexOf('-'); 
var result = [string.slice(0, firstIndex).trim(), string.slice(firstIndex+1).trim()] 
console.log(result); 

ne fait qu'une pause sur la première - et remplace les espaces à commencer et à la fin d'une partie de la fonction garniture

https://jsfiddle.net/gLwm7Lwv/1

2

Vous pouvez utiliser match (avec une expression régulière) pour mettre chaque chaîne en une paire (tableau avec 2 chaînes):

const data = [ 
 
    "Blue Oyster Cult - Don't Fear The Reaper", 
 
    "Jimi Hendrix - Come On (Let The Good Times Roll)", 
 
    "Molly Hatchet - Dreams I'll Never See", 
 
    "Gorillaz - 19 - 2000" 
 
]; 
 

 
const result = data.map(title => title.match(/(.*?)\s*-\s*(.*)/).slice(1)); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }