Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.02.2013, 23:15
Интересующийся
Отправить личное сообщение для zm_sansan Посмотреть профиль Найти все сообщения от zm_sansan
 
Регистрация: 26.05.2012
Сообщений: 26

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

Последний раз редактировалось zm_sansan, 23.02.2013 в 23:25.
Ответить с цитированием
  #2 (permalink)  
Старый 24.02.2013, 00:19
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 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.
Ответить с цитированием
  #3 (permalink)  
Старый 24.02.2013, 00:32
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

alert( '5*(6+9*5)*20'.match( /\([^)]+\)|\d+/g ) );
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 24.02.2013, 02:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

zm_sansan, а может нужен парсер ? То есть инструмент для разбора выражений и преобразования в абстрактное синтаксическое дерево? Хотя че-та я загнул ) Но если вдруг, то могу подсказать...
Ответить с цитированием
  #5 (permalink)  
Старый 24.02.2013, 12:51
Интересующийся
Отправить личное сообщение для zm_sansan Посмотреть профиль Найти все сообщения от zm_sansan
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 24.02.2013, 16:17
Интересующийся
Отправить личное сообщение для zm_sansan Посмотреть профиль Найти все сообщения от zm_sansan
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 24.02.2013, 16:26
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

zm_sansan, я предлагал http://zaach.github.com/jison/try/ , но в данном случае да, проще обойтись без этого.
Ответить с цитированием
  #8 (permalink)  
Старый 24.02.2013, 23:24
Аватар для Hekumok
Отправить личное сообщение для Hekumok Посмотреть профиль Найти все сообщения от Hekumok
 
Регистрация: 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", "*")) ;
__________________
★ ²º¹³ ☆
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка e-mail регулярное выражение mycoding Общие вопросы Javascript 4 09.02.2017 10:12
Регулярное выражение alerzo Events/DOM/Window 1 17.09.2012 19:20
Регулярное выражение: любой символ, включая перевод строки Gleb Общие вопросы Javascript 3 28.07.2011 12:15
регулярное выражение theo_ Общие вопросы Javascript 15 21.06.2010 10:29
регулярное выражение demi Общие вопросы Javascript 3 10.03.2009 13:10