2011-08-03 6 views
0

Je suis encore un débutant :)Regex Javascript pour obtenir la sous-chaîne, excluant un motif?

Je dois obtenir une sous-chaîne en ignorant la dernière section à l'intérieur [] (y compris les crochets []), à savoir ignorer la section [something inside] à la fin.

Remarque - Il peut exister d'autres occurrences uniques de [ dans la chaîne. Et ils devraient apparaître dans le résultat.

Exemple

entrée de la forme -

1 checked arranged [1678] 

sortie désirée -

1 checked arranged 

I a essayé avec cette

var item = "1 checked arranged [1678]"; 

var parsed = item.match(/([a-zA-Z0-9\s]+)([(\[d+\])]+)$/); 
          |<-section 1 ->|<-section 2->| 

alert(parsed); 

I a essayé de signifier ce qui suit -

section 1 - plusieurs occurrences de mots (contenant les littéraux et nos.) Suivi par des espaces

section 2 - ignorer le motif à la fin [quelque chose].

Mais je reçois 1678],1678,] et je ne sais pas dans quel sens il va.

Merci

Répondre

1

Vous pouvez le faire

var s = "1 checked arranged [1678]"; 

var a = s.indexOf('['); 

var b = s.substring(0,a); 

alert(b); 

http://jsfiddle.net/jasongennaro/ZQe6Y/1/

Ce s.indexOf('['); vérifie où le premier [ apparaît dans la chaîne.

Cette s.substring(0,a); coupe la chaîne, du début à la première [.

Bien sûr, cela suppose la chaîne est toujours dans un format similaire

+0

Mais il peut exister d'autres occurrences de '[' dans la chaîne. désolé j'ai raté cela dans la question –

+0

Pas de problème @Sandeepan Nath. Si le test est toujours avant la première occurrence de '[' alors cela fonctionnera toujours. –

0

essayer si vous voulez seulement se débarrasser de cette [] à la fin

var parsed = item.replace(/\s*\[[^\]]*\]$/,"") 
0
var item = "1 checked arranged [1678]"; 
var parsed = item.replace(/\s\[.*/,""); 
alert(parsed); 

qui fonctionnent comme voulu?

1
var item = '1 check arranged [1678]', 
    matches = item.match(/(.*)(?=\[\d+\])/)); 

alert(matches[1]); 

L'expression régulière je fait usage d'un positive lookahead d'exclure la partie indésirable de la chaîne. Le nombre entre crochets doit être une partie de la chaîne pour que la correspondance réussisse, mais elle ne sera pas renvoyée dans les résultats.

0

Utiliser échappé crochets et les parenthèses non-capture:

var item = "1 checked arranged [1678]"; 
var parsed = item.match(/([\w\s]+)(?:\s+\[\d+\])$/); 
alert(parsed[1]); //"1 checked arranged" 

Explication des expressions rationnelles:

([\w\s]+) //Match alphanumeric characters and spaces 
(?:   //Start of non-capturing parentheses 
\s*   //Match leading whitespace if present, and remove it 
\[   //Bracket literal 
\d+   //One or more digits 
\]   //Bracket literal 
)   //End of non-capturing parentheses 
$   //End of string 
2

OK est le problème ici dans votre expression

([a-zA-Z0-9\s]+)([(\[d+\])]+)$ 

Le problème est seulement dans la dernière partie

([(\[d+\])]+)$ 
^  ^
here are you creating a character class, 
what you don't want because everything inside will be matched literally. 

((\[d+\])+)$ 
^  ^^ 
here you create a capturing group and repeat this at least once ==> not needed 

(\[d+\])$ 
^
    here you want to match digits but forgot to escape 

Cela nous amène à

([a-zA-Z0-9\s]+)(\[\d+\])$ 

Voyez-here on Regexr, la chaîne complète est adaptée, la section 1 dans le groupe capture 1 et l'article 2 dans le groupe 2.

Lorsque vous remplacez maintenant la chose avec le contenu du groupe 1 vous avez terminé.