Подскажите регулярное выражение
не понимаю как должно выглядеть регулярное выражение, чтобы например из строки 5*(6+9*5)*20 получить массив 5, (6+9*5), 20 . Подскажите пожалуйста)
|
var arr = '5*(6+9*5)*20'.replace(/^(\d+)\*/i,"$1,").replace(/\*(\d+)$/i,",$1").split(","); for(var i=0;i<arr.length; i++){arr[i]=eval(arr[i]);} alert(arr.join(",\n")) |
alert( '5*(6+9*5)*20'.match( /\([^)]+\)|\d+/g ) ); |
zm_sansan, а может нужен парсер :) ? То есть инструмент для разбора выражений и преобразования в абстрактное синтаксическое дерево? Хотя че-та я загнул ) Но если вдруг, то могу подсказать...
|
danik.js нужен парсер, чтобы по знаку * разобрать выражение на части, притом не заглядывать в скобки, при парсинге. например у nerv_-а только в частном случае работает регулярное выражение, но тут я думаю уже моя ошибка, плохо сформулировал. У Deff-a вообще не работает как надо.
Вот например такой случай тоже должен обрабатываться 5*3.48*(-1)*a*(b*(3+9*u))*0.5 в результате должен получиться массив 5, 3.48, (-1), a, (b*(3+9*u)), 0.5 Т.е. исходное выражение это произведение слов и чисел, а также чего-то, взятое в скобки. По знаку * должно парситься и в результате получиться массив из множителей этого произведения парсер, который вы предлагаете, тоже будет интересно глянуть) |
Решил задачу таким скриптом
alert(prRazd("5*3.48*(-1)*a*(b*(3+9*u))*ololo*0.5",'*')); function prRazd(obj,c){ //парсит по знаку c, перепрыгивая скобки(т.к. в них тоже может быть этот знак) arr = []; for(var i=0, p=i;i<=obj.length;){ if(i==obj.length || obj.charAt(i)==c){ //если c arr.push(obj.substr(p,i-p)); i++; p=i; } else{ if(obj.charAt(i)=='(') i=parSk(obj,i)+1; //если выражение в скобках else{ //если число или имя переменной if(obj.indexOf(c,i)==-1) i = obj.length; else i = obj.indexOf(c,i); } } } return arr; } function parSk(s,i) { //находит парную скобку, будет работать при условии, что скобки стоят правильно var k1=0, k2=0, k; switch(s.charAt(i)){ case '(': k1++; k=1; break; case ')': k2++; k=-1; break; } do{ i+=k; switch(s.charAt(i)){ case '(': k1++; break; case ')': k2++; break; } }while(k1!=k2) return i; } |
zm_sansan, я предлагал http://zaach.github.com/jison/try/ , но в данном случае да, проще обойтись без этого.
|
zm_sansan,
function divide(str, s) { var bool = 0 ; var arr = [] ; var newStr = str[0] ; for(var i=1; i<str.length; i++) { if(bool) { newStr += str[i] ; if(str[i]==")") bool -= 1 ; if(str[i]=="(") bool += 1 ; continue ; } ; if(str[i]=="(") bool += 1 ; if(str[i]!=s) { newStr += str[i] ; if(i+1==str.length) arr.push(newStr) ; } else { arr.push(newStr) ; newStr = "" ; } ; } ; return arr ; } ; alert(divide("5*3.48*(-1)*a*(b*((3+9*(-1))*u))*ololo*0.5", "*")) ; |
Часовой пояс GMT +3, время: 06:19. |