web-dev-qa-db-fra.com

Fractionner une chaîne en fonction de plusieurs délimiteurs

J'essayais de diviser une chaîne en fonction de plusieurs délimiteurs en faisant référence à Comment diviser une chaîne en jQuery avec plusieurs chaînes comme séparateur

Depuis plusieurs délimiteurs, j'ai décidé de suivre

var separators = [' ', '+', '-', '(', ')', '*', '/', ':', '?'];
var tokens = x.split(new RegExp(separators.join('|'), 'g'));​​​​​​​​​​​​​​​​​

Mais je reçois une erreur

Uncaught SyntaxError: Invalid regular expression: / |+|-|(|)|*|/|:|?/: Nothing to repeat 

Comment le résoudre?

32
Okky

échappement nécessaire pour les caractères associés aux expressions rationnelles +, -, (,), * ,?

var x = "adfds+fsdf-sdf";

var separators = [' ', '\\\+', '-', '\\\(', '\\\)', '\\*', '/', ':', '\\\?'];
console.log(separators.join('|'));
var tokens = x.split(new RegExp(separators.join('|'), 'g'));
console.log(tokens);

http://jsfiddle.net/cpdjZ/

50
melc

Cela devrait fonctionner:

var separators = [' ', '+', '(', ')', '*', '\\/', ':', '?', '-'];
var tokens = x.split(new RegExp('[' + separators.join('') + ']', 'g'));​​​​​​​​​​​​​​​​​

La regex générée utilisera la classe de caractères regex: /[ +()*\/:?-]/g

De cette façon, vous n'avez besoin de rien échapper.

7
anubhava

Ce qui suit serait un moyen plus facile d'accomplir la même chose.

var tokens = x.split(new RegExp('[-+()*/:? ]', 'g'));​​​​​​​​​​​​​​​​​

Notez que - doit venir en premier (ou être échappé), sinon il pensera que c'est l'opérateur range (par exemple a-z)

4
samjudson

Je pense que vous auriez besoin d'échapper au +, * et?, Car ils ont une signification particulière dans la plupart des langages regex

2
Friso

Cela est dû au fait que des caractères tels que + et * ont une signification particulière dans Regex.

Changez votre jointure de | à |\ et tout devrait bien se passer, échappant aux littéraux.

1
Roy Dictus