Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/46: Рейтинг темы: голосов - 46, средняя оценка - 4.85
 Аватар для Nazz
898 / 729 / 80
Регистрация: 12.03.2009
Сообщений: 2,804
Записей в блоге: 2

Регулярка на проверку скобок

01.07.2013, 11:10. Показов 9196. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу функцию для проверки скобок в строке.
Тоесть есть строка вида [1]+(2-[4*3]), нужно проверить правильно ли в ней все скобки зактиты и открыты.
Как я думаю:
регуляркой выбрать все совпадения в которых есть [)] либо [(] либо (]) или ([).
Получается что может быть такие варианты: [9 * 3) - 4] или [12*(65-2]. Вот думаю как правильно сделать.

Делаю с использованием функции preg_match, так как это наиболее логично.
Думал регулярку в таком роде, для первого варианта:
PHP
1
preg_match('/\[([^\(]*)\]/');
но тут проблема в том что могут и входить и сиоволы с *)*, а это уже не правильно. Так как нужно чтобы была только открывающаа скобка без закрывающей.

Может кто подскажет?

Добавлено через 4 часа 16 минут
никто не подскажет?)

Добавлено через 10 часов 0 минут
Нужно просто регуляркой найти где есть в таких скобках [], открытая или закрытая такая ).
Никто не подскажет?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2013, 11:10
Ответы с готовыми решениями:

Регулярка на проверку скобок
Друзья помогите решить задачу в регулярных выражениях не селен. Составьте программу, которая проверяет корректность баланса скобок в...

Регулярка на проверку число + _s
Нужно проверить строку чтобы она начиналась на любое число, а после этого числа может быть '_s', а может и не быть. Пробовал вот так ...

Чтение скобок внутри скобок
=(RelativeTime (Float) = 0.00,Color (Color) = (R=255,G=255,B=255,A=255),) Короче из скобок надо выдернуть, что красным? Как это...

2
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
01.07.2013, 16:24
С помощью рекурсивного выражения можно лишь проверить полную (не)правильность. Нельзя будет сказать, в каком месте и что именно неправильно.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function test($code) {
    return (bool) preg_match(
        '/
            ^
            (?P<code>
                (?:
                    \\[ (?&code)? \\]
                    #          -^-
                    # если скобки не могут быть пустыми,
                    # то квантификатор "?" надо убрать
                |
                    \\( (?&code)? \\)
                    #          -^-
                    # аналогично про пустые скобки
                |
                    \\{ (?&code)? \\}
                    #          -^-
                    # аналогично про пустые скобки
                |
                    # простой текст
                    [^ \\[ \\] () {} ]++
                )++
            )?
            #^-
            # если вся строка не может быть пустой,
            # то квантификатор "?" надо убрать
            $
        /x',
        $code
    );
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
foreach (
    array(
        "a(b{c[d]}e[(f)g]h)i",
        "a(b{c[d]}e[(f",
        "a(b{c[d]}e[(f}g]h)i",
        "a(b{c[d]}e[(f)g]h)i])",
        "a[]b",
        "",
    )
    as $i => $string
) {
    echo $i, ': ', $string, '   '
        , (test($string))
            ? '+ok'
            : '-fail'
        , PHP_EOL
    ;
}
Code
1
2
3
4
5
6
0: a(b{c[d]}e[(f)g]h)i   +ok
1: a(b{c[d]}e[(f   -fail
2: a(b{c[d]}e[(f}g]h)i   -fail
3: a(b{c[d]}e[(f)g]h)i])   -fail
4: a[]b   +ok
5:    +ok
Можно и вручную парсить посимвольно. Тогда будет возможность отследить место и суть проблемы:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function validate($code) {
    $stack = array();
    $pair = array(
        '(' => ')',
        '[' => ']',
        '{' => '}',
    );
 
    $code = (string) $code;
 
    /* если пустая строка недопустима
    if ("" == $code) {
        throw new Exception("Пустая строка");
    }
    # */
 
    $len = strlen($code);
 
    for ($i = 0; $i < $len; $i++) {
        $ch = $code[$i];
        switch ($ch) {
            case '(':
            case '[':
            case '{':
                array_push($stack, $pair[$ch]);
            break;
 
            case ')':
            case ']':
            case '}':
                if (!$stack) {
                    throw new Exception('Закрывающая "' . $ch . '", когда нечего закрывать');
                }
 
                if ($ch != end($stack)) {
                    throw new Exception('Ожидалось "' . end($stack) . '", но внезапно "' . $ch . '"');
                }
 
                array_pop($stack);
        }
    }
 
    if ($stack) {
        throw new Exception('В конце остались незакрыты: "' . join('", "', array_reverse($stack)) . '"');
    }
 
    return true;
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
foreach (
    array(
        "a(b{c[d]}e[{f}g]h)i",
        "a(b{c[d]}e[{f",
        "a(b{c[d]}e[{f)g]h)i",
        "a(b{c[d]}e[{f}g]h)i])",
        "a[]b",
        "",
    )
    as $i => $string
) {
    try {
        echo $i, ': ', $string, '   ';
        validate($string);
        echo '+ok', PHP_EOL;
    }
    catch (Exception $e) {
        echo '-fail: ', $e->getMessage(), PHP_EOL;
    };
}
Code
1
2
3
4
5
6
0: a(b{c[d]}e[{f}g]h)i   +ok
1: a(b{c[d]}e[{f   -fail: В конце остались незакрыты: "}", "]", ")"
2: a(b{c[d]}e[{f)g]h)i   -fail: Ожидалось "}", но внезапно ")"
3: a(b{c[d]}e[{f}g]h)i])   -fail: Закрывающая "]", когда нечего закрывать
4: a[]b   +ok
5:    +ok
1
 Аватар для Nazz
898 / 729 / 80
Регистрация: 12.03.2009
Сообщений: 2,804
Записей в блоге: 2
01.07.2013, 18:47  [ТС]
написал, как мне кажется тоже не плохой вариант функции.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function checkBrackets($sString = null)
{
    //первая проверка на то, что данные были переданы, и строка не пустая
    //в этом варианте возвращаем true, так как проблем с дужками нету :)
    if(is_null($sString) || $sString == '')
        return true;
    
    //инициализируем скобки которые будем проверять    
    $aSkobki = array('(', ')', '[', ']');
    
    //получаем длину строки для её обхода.
    //а так же чтобы не проверять прямо в цикле. Дольше будет выполняться.
    $iLength = strlen($sString);
    //инициализируем переменную для строки скобок
    $sSkobki = '';
    for($i = 0; $i < $iLength; $i++)
    {
        if(in_array($sString[$i], $aSkobki))
            $sSkobki .= $sString[$i];
    }
    //чистим память
    unset($sString);
    //получаем длину строки чтобы обойти её всю и очистить.
    //такой вариант не очень хорош, но по условии нужна была одна функция.
    //если бы можно несколько функций, то создал бы рекурсивную функцию для чистки строки
    $iLength = strlen($sSkobki);
    //чистим строку
    for($i = 0; $i < $iLength; $i++)
        $sSkobki = str_replace(array('[]', '()'), array('', ''), $sSkobki);
 
    //возвращаем результат
    if(strlen($sSkobki) == 0)
        return true;
    else
        return false;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2013, 18:47
Помогаю со студенческими работами здесь

Регулярка на проверку номера телефона (сот.)
Добрый день подскажите пожалуйста, пытаюсь написать регулярку что бы пропускала телефоны формата 79050112233. Написал вот такую: ...

Задача на проверку скобок
Здравствуйте, мне нужна помощь по такой вот задаче: Дана строка, состоящая из различных видов скобок – то есть символов '(', ')', '',...

Функция на проверку наличия скобок
Написать функцию, которая проверяет, что в строке, переданной в качестве аргумента, соблюдается баланс открытых и закрытых скобок. При этом...

Задача на проверку парности скобок
Добрый день, недавно начал изучать Python и возникла сложность с решением задачи: Входные данные: строка, состоящая из открывающих и...

Задача на проверку баланса скобок
Задача на проверку баланса скобок,и правильности их вхождения, тоесть если скобки так расположены , то это правильное вхождение, а вот и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru