Разделить строку на основе нескольких разделителей
Я пытался разбить строку на основе нескольких разделителей, обратившись Как разделил строку в jquery с несколькими строками как разделитель
Поскольку несколько разделителей я решил следовать
var separators = [' ', '+', '-', '(', ')', '*', '/', ':', '?'];
var tokens = x.split(new RegExp(separators.join('|'), 'g'));
Но я получаю сообщение об ошибке
Uncaught SyntaxError: Invalid regular expression: / |+|-|(|)|*|/|:|?/: Nothing to repeat
Как его решить?
Ответы
Ответ 1
escape, необходимый для символов, связанных с регулярным выражением +, -, (,), *,?
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/
Ответ 2
Это должно работать:
var separators = [' ', '+', '(', ')', '*', '\\/', ':', '?', '-'];
var tokens = x.split(new RegExp('[' + separators.join('') + ']', 'g'));
Сгенерированное регулярное выражение будет использовать класс символов regex: /[ +()*\/:?-]/g
Таким образом вам не нужно ничего скрывать.
Ответ 3
Следующим будет более простой способ выполнить одно и то же.
var tokens = x.split(new RegExp('[-+()*/:? ]', 'g'));
Обратите внимание, что -
должен быть первым (или экранирован), иначе он будет считать, что это оператор range
(например, a-z
)
Ответ 4
Я думаю, вам нужно было бы избежать +, * и?, поскольку они имеют особое значение в большинстве языков регулярных выражений
Ответ 5
Это связано с тем, что символы, такие как +
и *
, имеют особое значение в Regex.
Измените ваше соединение с |
на |\
, и вы должны быть в порядке, избегая литералов.
Ответ 6
Скажите, что ваша строка:
let str = 'word1
word2;word3,word4,word5;word7
word8,word9;word10';
Вы хотите разбить строку на следующие разделители:
- Двоеточие
- Точка с запятой
- Новая линия
Вы можете разделить строку следующим образом:
let rawElements = str.split(new RegExp('[,;\n]', 'g'));
Наконец, вам может понадобиться обрезать элементы в массиве:
let elements = rawElements.map(element => element.trim());
Ответ 7
Что делать, если мне нужно включить одну обратную косую черту в списке разделителей? Я пробовал '/\\/' так же, как '/\//', ни один из них не работал. Благодарю.