2016-08-24 3 views
1

Привет, может кто-нибудь помочь мне о регулярном выражении. это строкаРегулярное выражение Javascript со специальным символом между

((11A1:I19 + 11A1:K19 + 11A1:L19 + 11A1:I20 + 11A1:K20) - (11A1:N19 + 11A1:N20)) 

и это регулярное выражение

/([0-9a-z])\w+:\w+([0-9-a-z])/g 

Я хочу взять 11A1: I19, 11A1: K19, и т.д .. и заменить его со значениями, так что строка будет выглядеть следующим образом (1767 + 154 + 1123 - (151-17)) Это полный код

$f.each(function() { 
    var formula = $(this).data("formula"); 

    var formula = $f.data("formula"); 

    formula.split(/([0-9a-z])\w+:\w+([0-9-a-z])/g) 
     .forEach(function(el) { 
      if (el) { 
       var hy = el.split(':'); 
       let v = $('[data-sheet="' + hy[0] + '"][data-cell="' + hy[1] + '"]').val(); 
      formula = formula.replace(el, v); 
      } 
     }); 

    console.log(formula) 
    var result = eval(formula); 
    $f.val(result) 
}); 
+0

Какую часть исходной строки вы хотите извлечь? Регулярное выражение принимает только первый символ ([0-9a-z]) и последний. –

+0

В этой строке ... "((11A1: I19 + 11A1: K19 + 11A1: L19 + 11A1: I20 + 11A1: K20) - (11A1: N19 + 11A1: N20))« Я хочу получить: 11A1: I19 11A1: K19 .... .... ... –

ответ

1

Я считаю, что вы хотите сделать что-то вроде этого (не проверено с JQuery)

$f.each(function() { 
var formula = $(this).data("formula"); 

var formula = $f.data("formula"); 

formula.split(/([0-9a-z]+:[0-9a-z]+)/gi) 
    .forEach(function(el) { 
     if (el) { 
      var hy = el.split(':'); 
      if (hy.length==2) { 
       let v = $('[data-sheet="' + hy[0] + '"][data-cell="' + hy[1] + '"]').val(); 
       formula = formula.replace(el, v); 
      } 
     } 
    }); 

console.log(formula) 
var result = eval(formula); 
$f.val(result) 
}); 

Update: После еще некоторого мышления, этот код более компактным и, возможно, легче читать:

$f.each(function() { 
var formula = $(this).data("formula"); 

var formula = $f.data("formula"); 

var Re=/([0-9a-z]+):([0-9a-z]+)/gi; 
var hy; 
var replaced=formula; 
while ((hy=Re.exec(formula))!=null) { 
    let v = $('[data-sheet="' + hy[1] + '"][data-cell="' + hy[2] + '"]').val(); 
    replaced = replaced.replace(hy[0], v); 
} 

console.log(replaced) 
var result = eval(replaced); 
$f.val(result) 
}); 

По соображениям безопасности, я хотел бы также проверить, что v является допустимым числом перед его заменой в формула. Это позволит избежать оценки кода, который может быть допустимым выражением javascript с тяжелыми последствиями. Вы можете проверить это с:

if (isNaN(v+0)) continue; 

Добавьте его перед заменой hy[0] с v.

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