Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Баланс символов


Автор: s1lver 5.12.2008, 21:50
Подсобите с такой задачей:

Нужно выполнить проверку баланса скобок в текстовой области и если открывающейся скобке не соответствует закрывающаяся, то вывести ошибку во вторую текстовую область.  smile 

Автор: Michael.de 6.12.2008, 00:19
s1lver, каких скобок? Таких: ( ) или ещё [ ] и { } ?
Например так: есть стринг, с помощью charAt() считываем в цикле каждый знак и сравниваем его с открывающейся и закрывающейся скобками. Открывающая скобка - плюсуем 1 в переменную, закрывающая - минусуем. В конце смотришь: переменная не равна 0 (как и в начале) - ошибка.
Попробуй написать это сам, а мы поможем smile

Автор: Itsys 6.12.2008, 09:29
А можно с помошью регулярки:
сначала ищем все нормальные
в цикле wile exec регулярку
Код

/^[^\(]+\(([^\)]+)\)[^\)]+$/

меняем тестируемую переменную на второй элемент возвращенного массива

а после проверяем наличие открывающей/закрывающей скобки
Код

/[\(\)]/


и если находим, выводим сообщение

ЗЫ если надо проверять не только (), то цикл запускается несколько раз.

Автор: s1lver 6.12.2008, 11:06
Цитата

s1lver, каких скобок? Таких: ( ) или ещё [ ] и { } ?


Круглых вообще-то, про те я даже не подумал



Автор: s1lver 6.12.2008, 11:48
Вот,тока чур сильно не ругать за глупость  smile 

Код


<script language="javascript" type="text/javascript" > 
function test()
{ i="("
  j=")"
 while (S.charAt())
{ form1.textarea.value=s(i+1, j+1)
 return {form1.textarea2.value}
 }
/* while (/^[^\(]+\(([^\)]+)\)[^\)]+$/) 
document.write("form1.textarea2.value");*/
}
</script>

Автор: s1lver 6.12.2008, 12:31
 Не, наверное надо так сделать, поправьте где ошибусь:

Код


<script language="JavaScript"> 


function test(obj) 

{ var s=obj.textarea.value 

var res=l 

var ch=s.charAt(0)

if (!(ch>='(' && ch<=')')) res=0; 

if (res!=0)

{ for (var i=l; i <= s.length-1; i++) 

{ ch=s.charAt(i)

if (!(ch>='(' && ch<=')')) 

{res=0; break} 

} 

}

if (res==l) obj.textarea2.value="" 

else obj.textarea2.value="Ошибок нет" 

}

</script> 

Автор: Michael.de 6.12.2008, 19:17
s1lver, вот как пример:
Код

<html>
<head>
<script type='text/javascript'>
function test(){
 var txt, len, i, tmp, error=0, message;
 txt=document.getElementById('text').value;
 message=document.getElementById('mess');
 len=txt.length;
 for (i=0; i<len; i++){
  tmp=txt.charAt(i);
  if (tmp=='(' || tmp==')') tmp=='(' ? error++ : error--;
 }
 if (error){
  message.style.color='red';
  message.value='Galakteko f opasnoste :/';
 }
 else {
  message.style.color='blue';
  message.value="It's Okay :)";
 }
}
</script>
<body>
<textarea id='text' style='width:300px;height:200px;border:1px solid #AAD;background-color:#EEF'>pischem tyta :)</textarea>
<button onclick='test();'>Click me</button><br>
<textarea id='mess' readonly='readonly' style='border:0;overflow:hidden;width:300px'></textarea>
</body>
</html>
Разберёшься? smile

Автор: Itsys 7.12.2008, 11:20
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Проверка форм</title>
</head>
<body>
<span id="t1">(2+3)*5</span><br>
<span id="t2">(2+3)*5)</span><br>
<script type="text/javascript" language="JavaScript">
    var t1 = document.getElementById('t1').innerHTML;
    temp = /^.*\((.*)\).*$/.exec(t1);
    while (temp){
        t1 = temp[1];
        temp = /^.*\((.*)\).*$/.exec(t1);
    }
    if (/[\(\)]/g.test(t1)){
        document.write("первая строка неправильная<br>");
    }
    else{
        document.write("первая строка правильная<br>");
    }

    t1 = document.getElementById('t2').innerHTML;
    temp = /^.*\((.*)\).*$/.exec(t1);
    while (temp){
        t1 = temp[1];
        temp = /^.*\((.*)\).*$/.exec(t1);
    }
    if (/[\(\)]/g.test(t1)){
        document.write("вторая строка неправильная<br>");
    }
    else{
        document.write("вторая строка правильная<br>");
    }
</script>
</body>
</html>


Автор: ksnk 7.12.2008, 12:21
Michael.de, )))))((((( - галактеко в полной безопасносте...

Itsys, (1+(2+3)*5)  - галактеко в опасносте...

Вот, написалось...
Код

function checkit(str){
  var stack=[],m,
      reg=/.*?([\(\[{\)\]}])/g; // недопарс
  while(m=reg.exec(str)){
    switch (m[1]){
      case '{':case '(':case '[':
         stack.push(m[1]);
         break;
      case '}':
         if('{'!=stack.pop())
            return 'нет открывающего {';
         break; 
      case ']':
         if('['!=stack.pop())
            return 'нет открывающего [';
         break; 
      case ')':
         if('('!=stack.pop())
            return 'нет открывающего (';
         break; 
    }
  }
   if(stack.length==0)
       return true;
    alert(stack);
    return 'Не закрыты скобки.';
}

var result=checkit('{1+(2+3)}*5');
if(result===true)
  alert('ok!');
else
  alert(result);


P.S. http://phpclub.ru/talk/showthread.php?s=&threadid=106961&highlight=%E2%EB%EE%E6%E5%ED%ED%EE%F1%F2%FC рекурсивную для анализа вложенности скобок. Правда она для JS, imho, не будет работать...


Автор: s1lver 7.12.2008, 16:19
Цитата

Разберёшься? smile



Конечно smile 

Автор: Michael.de 8.12.2008, 03:57
Цитата(ksnk @  7.12.2008,  12:21 Найти цитируемый пост)
Michael.de, )))))((((( - галактеко в полной безопасносте...
Так я и не спорю, просто в первом посте не написано, что это будет применяться для анализа мат. выражения. А алгоритм я знаю smile
P.S. Пару лет назад я написал (на яве) пару классов, которые получали строку типа sin(cos(x-2))+x^(x/2-Pi/4^(5-tan(sin(x-1)))) ... и т.п. , анализировали на мат. корректность записи и считали (при зад. х) значение выражения. Т.е. как бы JavaScript, но... без eval() smile

Автор: s1lver 8.12.2008, 18:04
А что сюда еще можно прикрутить? Так на всякий случай...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)