23.02.2013, 23:15
|
Интересующийся
|
|
Регистрация: 26.05.2012
Сообщений: 26
|
|
Подскажите регулярное выражение
не понимаю как должно выглядеть регулярное выражение, чтобы например из строки 5*(6+9*5)*20 получить массив 5, (6+9*5), 20 . Подскажите пожалуйста)
Последний раз редактировалось zm_sansan, 23.02.2013 в 23:25.
|
|
24.02.2013, 00:19
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
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"))
Последний раз редактировалось Deff, 24.02.2013 в 00:24.
|
|
24.02.2013, 00:32
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
alert( '5*(6+9*5)*20'.match( /\([^)]+\)|\d+/g ) );
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
24.02.2013, 02:45
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
zm_sansan, а может нужен парсер ? То есть инструмент для разбора выражений и преобразования в абстрактное синтаксическое дерево? Хотя че-та я загнул ) Но если вдруг, то могу подсказать...
|
|
24.02.2013, 12:51
|
Интересующийся
|
|
Регистрация: 26.05.2012
Сообщений: 26
|
|
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
Т.е. исходное выражение это произведение слов и чисел, а также чего-то, взятое в скобки. По знаку * должно парситься и в результате получиться массив из множителей этого произведения
парсер, который вы предлагаете, тоже будет интересно глянуть)
Последний раз редактировалось zm_sansan, 24.02.2013 в 13:07.
|
|
24.02.2013, 16:17
|
Интересующийся
|
|
Регистрация: 26.05.2012
Сообщений: 26
|
|
Решил задачу таким скриптом
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, 24.02.2013 в 16:29.
|
|
24.02.2013, 16:26
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
zm_sansan, я предлагал http://zaach.github.com/jison/try/ , но в данном случае да, проще обойтись без этого.
|
|
24.02.2013, 23:24
|
|
✔
|
|
Регистрация: 04.06.2012
Сообщений: 513
|
|
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", "*")) ;
__________________
★ ²º¹³ ☆
|
|
|
|