2016-02-25 4 views
1

Здесь мой код.Регулярное выражение и обертка минус

var string = 'number1 + number2 - number3'; 
var operators = [ 
    {o: '+', regex: '\\+'}, 
    {o: '-', regex: '\\-'} 
]; 

$.each(operators, function(i, operator){ 
    string = string.replace(
     new RegExp(operator.regex, "g"), 
     '<span class="formula-operator">' + operator.o + '</span>' 
    ); 
}); 

Мой CSS-класс заменен дважды. Как мне изменить свое регулярное выражение?

+0

Игорь, 'операторы вар = [ {о: '+', регулярное выражение: '\\ + ([^ <]*?!)'}, { о: '-', регулярное выражение:«\\ - (? ! [^ <]*) '} ]; ' –

+0

@ WiktorStribiżew, Да, это работает. Спасибо. –

+0

Я отправлю тогда. –

ответ

1

Вы можете использовать lookaheads, которые будут убедиться, что мы не тег диапазона.

var operators = [ 
    {o: '+', regex: '\\+(?![^<]*</span>)'}, 
    {o: '-', regex: '\\-(?![^<]*</span>)'} 
]; 

(?![^<]*</span>) опережения потерпит неудачу матч, если оператор математике следуют другие, чем < ([^<]*) нуля или более символов с последующим </span>.

Это не будет работать с вложенными <span> тегами, для этого вам понадобится парсер DOM.

2

Если вам не нужны операторы сам массив, вы можете использовать один регулярное выражение:

string = string.replace(/[+-]/g, operator => '<span class="formula-operator">' + operator + '</span>');

(В противном случае это выражение можно строить на основе самих операторов)

PS, вторая замена происходит потому, что у вас есть матч (-) внутри <span class="formula-operator">


редактировать: пример с динамическим зданием выражения:

var string = 'number1 + number2 - number3'; 
var operators = ['+','-']; 

string = string.replace(
      new RegExp('[' + operators.join('') + ']', "g"), 
     o => '<span class="formula-operator">' + o + '</span>'); 
+0

Просто FYI: вам не нужно избегать '+' и '-' в этом классе символов -' [+ -] ' –

+0

@ WiktorStribiżew Хорошая точка. Сила привычки :) –

+0

Это всего лишь пример. В реальной жизни у меня много других замен. –

Смежные вопросы