Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Подскажите регулярное выражение (https://javascript.ru/forum/misc/35836-podskazhite-regulyarnoe-vyrazhenie.html)

zm_sansan 23.02.2013 23:15

Подскажите регулярное выражение
 
не понимаю как должно выглядеть регулярное выражение, чтобы например из строки 5*(6+9*5)*20 получить массив 5, (6+9*5), 20 . Подскажите пожалуйста)

Deff 24.02.2013 00:19

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"))

nerv_ 24.02.2013 00:32

alert( '5*(6+9*5)*20'.match( /\([^)]+\)|\d+/g ) );

danik.js 24.02.2013 02:45

zm_sansan, а может нужен парсер :) ? То есть инструмент для разбора выражений и преобразования в абстрактное синтаксическое дерево? Хотя че-та я загнул ) Но если вдруг, то могу подсказать...

zm_sansan 24.02.2013 12:51

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 16:17

Решил задачу таким скриптом
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;
}

danik.js 24.02.2013 16:26

zm_sansan, я предлагал http://zaach.github.com/jison/try/ , но в данном случае да, проще обойтись без этого.

Hekumok 24.02.2013 23:24

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.