2010-09-04 4 views
0

J'ai une chaîne comme ceci: 02-09-10, 20:19 (1 dagen geleden). J'ai besoin du 1 à l'intérieur des parenthèses. J'ai utilisé cette expression rationnelle:JavaScript Regex

myStr.replace(/(.+*)\(([0-9]{1,}) dagen geleden\)/i, '$2')

Mais cela ne fonctionne pas ... Que faire?

Cordialement, dronte

Répondre

0

Je Je ne suis pas tout à fait sûr de la façon dont je me suis retrouvé à cette question, mais j'ai décidé de développer un point que j'ai soulevé dans les commentaires précédents. Vous utilisez string.replace()string.match() ou regex.exec() serait plus approprié.

De plus, vous pouvez atteindre votre objectif sans même utiliser des expressions régulières, ce qui devrait être plus efficace et plus compréhensible si vous n'êtes pas trop avertis sur regexes:

// The input string: 
var myStr = "02-09-10, 20:19 (1 dagen geleden)"; 

// substring() would work just as well in place of slice() here: 
alert(myStr.slice(
    // slice from the 1st character after the opening brace, 
    myStr.indexOf("(")+1, 
    // to the space just before "dagen" 
    myStr.indexOf(" dagen") 
)); 
// -> 1 

En fait, l'expression régulière vous êtes venu avec est si explicite, vous pouvez changer le premier argument de la tranche à un numéro que vous connaissez:

myStr.slice(17, myStr.indexOf(" dagen")); 
// -> 1 
+1

Merci! Je n'ai pas pensé à ça !! C'est en effet toujours dans le format que j'ai dit, donc, c'est plus rapide! – dododedodonl

1

Le (.+*) est invalide. Vous voulez plutôt (.+?). Et utilisez .match ou re.exec pour obtenir une sous-chaîne, et non .replace.

Si plusieurs apparitions:

var rx = /\((\d+) dagen geleden\)/g; 
var res = []; 
while((m = rx.exec(myStr))) { 
    res.push(m[1]); 
} 
return res; 

Sinon, il suffit d'utiliser:

var m = myStr.match(/\((\d+) dagen geleden\)/); 
if (m) 
    return m[1]; 
else { 
    // not found. 
} 
+0

également '' + est le même que '{1,}' – adamse

1

.+* consommera toute la chaîne comme il est gourmand, utilise aussi à la fois + et * est faux.

var myStr = "02-09-10, 20:19 (1 dagen geleden)"; 
myStr.match(/([0-9]+) dagen geleden\)$/)[1]; // 1 
+0

Ok, cela fonctionne! 'myStr.replace (/ \ d {2} - \ d {2} - \ d {2}, \ d {2}: \ d {2} \ (([0-9] +) dagen geleden \) $ /, "$ 1"); ' – dododedodonl

+1

@dodo: Ce n'est pas intelligent d'utiliser replace pour extraire quelque chose d'une chaîne de la manière dont vous le faites - c'est exactement ce que * match() * et * exec() * sont fournis. KennyTM et Adamse ont tous deux fourni des solutions adaptées et plus lisibles qui atteignent le même objectif. –

+0

@Andy: Pourquoi n'est-il pas intelligent d'utiliser remplacer ?? – dododedodonl

0

Pour le trouver

var a = "02-09-10, 20:19 (1 dagen geleden)".match(/\(([0-9]+)/) 

Pour obtenir le numéro

parseInt(a[1], 10) 

Si vous voulez remplacer 1 par 2

"02-09-10, 20:19 (1 dagen geleden)".replace(/\(([0-9]+)/, '(2') 

Et ... 1 Dagen geleden est erroné grammaticalement;)

0

Voici votre première tentative regex:

% js 
Rhino 1.7 release 2 2009 03 22 
js> var x = '02-09-10, 20:19 (1 dagen geleden)'; 
js> x.replace(/(.+*)\(([0-9]{1,}) dagen geleden\)/g, '$2'); 
js: uncaught JavaScript runtime exception: SyntaxError: Invalid quantifier * 

Comme quelqu'un l'a déjà mentionné, vous ne voulez pas que astérisque. Il suffit de se débarrasser de celui-ci:

js> x.replace(/(.+)\(([0-9]{1,}) dagen geleden\)/g, '$2'); 
1 

Il y a le "1" que vous vouliez.

Mais vous pouvez améliorer cela. Pourquoi dire '[0-9] {1,}' quand '\ d +' signifie la même chose? Aussi, êtes-vous sûr qu'il n'y aura jamais de personnages au-delà de cette finale ")"? Y aura-t-il des espaces vagabonds, ou les espaces pourraient-ils être d'autres espaces blancs (un onglet, peut-être)? Si vous voulez vraiment que ce nombre avant « Dagen geleden » Je l'écris comme ceci:

js> x = x.match(/\((\d+)\s+dagen\s+geleden\)/)[1]; 
1 

Il attrapera ce numéro même si votre chaîne a garbage inattendue:

js> "garbage (255 dagen geleden) more garbage".match(/\((\d+)\s+dagen\s+geleden\)/)[1]; 
255 
+0

La chaîne sera toujours dans le format que j'ai dit ... Je vais essayer la chose match! – dododedodonl