Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как найти "крайние" скобки?

7.3K
21 ноября 2006 года
JB13
64 / / 05.09.2005
Все знают регулярное выражение, чтобы найти самые вложенные скобки. А кто-нибудь знает, как найти самые "крайние" скобки? т.е. есть скажем такой текст

 
Код:
{блок {перед} блоком} Текст {скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1} еще {второй блок}


какое регулярное выражение можно использовать, чтобы получить вот это

{блок {перед} блоком}
{скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1}
{второй блок}

два часа просидел, так и не смог ничего придумать :(
300
21 ноября 2006 года
ReDrum
689 / / 20.04.2000
Цитата: JB13
Все знают регулярное выражение, чтобы найти самые вложенные скобки. А кто-нибудь знает, как найти самые "крайние" скобки? т.е. есть скажем такой текст

 
Код:
{блок {перед} блоком} Текст {скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1} еще {второй блок}


какое регулярное выражение можно использовать, чтобы получить вот это

{блок {перед} блоком}
{скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1}
{второй блок}

два часа просидел, так и не смог ничего придумать :(



Необязательно это делать при помощи регулярных выражений
Есть теория по поводу интерпретаторов компиляторов.
Ключевые слова - "польская запись". На этой основе, ты сможешь выбрать блоки абсолютно любой вложенности или последовательности

7.3K
21 ноября 2006 года
JB13
64 / / 05.09.2005
Сенкс, но польскую натацию и алгоритмы с последовательным перебором всех символов я не хочу использовать по причине того, что php довольно медленно со всем этим делом работает. А модуль регулярных выражений все-таки написан на C или подобном языке, соответсвенно с помощью него решить задачу, с большими обьемами текста, получается намного быстрее.

Думал я еще над регулярным выражением, и мне кажеться что это невозможно, т.к. нельзя точно описать границы "крайних" скобок, их можно только подсчитать, а это, насколько я знаю, с помощью регулярных выражений не сделаешь :(

Попробую на пхп последовательно перебирать все символы, посмотрю насколько медленно получиться.
300
22 ноября 2006 года
ReDrum
689 / / 20.04.2000
Не факт, что твоя регулярка будет работать быстрее и очень сомнительно что она не будет трехэтажной.
Сам разбор прост и вне имеет длиных операций. Да и такой код можно поддерживать с куда меньшими силами силами чем регулярные выражения ;)=
15K
23 ноября 2006 года
gruz0
71 / / 23.11.2006
Объявляем:
 
Код:
$ereg = "{блок {перед} блоком} Текст {скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1} еще {второй блок}";


 
Код:
echo "{второй блок}:<br>";
preg_match("/((\{[\w\ \{]+\}))$/",$ereg,$match);
echo($match[0]);


 
Код:
echo "{скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1}";

По данным pcre.ru, данный регексп соответствует твоему запросу:
[COLOR="Red"]([\W\ ]{0,6}[0-9])+([\W0-9\ ]{0,6})*[/COLOR]

Попробуй модифицировать ;)
300
23 ноября 2006 года
ReDrum
689 / / 20.04.2000
условие задачи, запросто :)=
15K
24 ноября 2006 года
gruz0
71 / / 23.11.2006
Цитата: ReDrum
условие задачи, запросто :)=


Это к чему относится? :)

300
24 ноября 2006 года
ReDrum
689 / / 20.04.2000
Ваша регулярка относится к частному случаю.
Наверняка вы догадываетесь, что существуют варианты в которых будет куда больше последовательностей или вложенностей скобок. И общее решение задачи с помошью рерулярного выражения будет сложным ;)=
7.3K
25 ноября 2006 года
JB13
64 / / 05.09.2005
Результат алгоритма с перебором.

Перебрал 100 раз текст в 35100 (~4300 слов) символов, что заняло 8сек. Медленно конечно, но пока меня устраивает. Кому интересно, вот функция (она просто переберает и считает вложенность скобок), может кто что побыстрее знает.

 
Код:
function ch_brackets($text, $bracket_open, $bracket_close) {
    $b_open = 0;
    for($i=0;$i<strlen($text);$i++) {
        if ($text{$i} == $bracket_open) $b_open++;
        if ($text{$i} == $bracket_close) $b_open--;
    } //for
    return $new_text;
} //function ch_brackets


P.S. тестилось на обыкновенной рабочей станции Cel2.6, 512RAM, Win XP SP2, Apache 2.0.59, PHP 5.1.2 (все локально). Компьютер был загружен антивиром, файрволом, аськой, почтой и что-то качалось :)
434
24 декабря 2006 года
Poltos
105 / / 18.08.2004
Все хорошо когда дело косается одного только символа, а если их несколько да еще и "уникальных", которые только с помощью регулярного выражения ищутся.

У меня похожий вопрос, но нужно узнать всего лишь количество совпадений.
С помощью регулярных выражений можно посчитать количество вхождений подстроки в строку? (на php)

п.с. не стал создавать новую тему
337
24 декабря 2006 года
shine
719 / / 09.06.2006
Цитата: Poltos
С помощью регулярных выражений можно посчитать количество вхождений подстроки в строку?



preg_match_all() даст тебе массив совпадений. Количество элементов массива сможешь найти? ;)

434
24 декабря 2006 года
Poltos
105 / / 18.08.2004
preg_match_all(), с помощью ее знаю, но мне нужно только количество, без промежуточного результата. Для экономии памяти да и времени.
337
24 декабря 2006 года
shine
719 / / 09.06.2006
Оптимизация? Знаю-знаю. Сам этим болел... :) Читай здесь: http://rsdn.ru/article/philosophy/Optimization.xml
13
25 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
Цитата: shine
Оптимизация? Знаю-знаю. Сам этим болел... :) Читай здесь: http://rsdn.ru/article/philosophy/Optimization.xml



Да...было дело...болел, но успешно выздоровел :D

434
25 декабря 2006 года
Poltos
105 / / 18.08.2004
2 shine, RussianSpy Нет не оптимизация уменя, просто другая задача поставлена, где не нужен промежуточный результат и соответственно зачем зря грузить машину. Темболее при неоднократных вызовах функции совсем каша получется, а потом как раз и нужно будет оптимизировать, не хочу два раза одну и ту же работу делать. оО
337
25 декабря 2006 года
shine
719 / / 09.06.2006
Poltos, не бойся грузить машину. Ты же не будешь свою функцию вызывать миллиарды раз в секунду? Поэтому ничего с твоей машиной не случиться если она выполнит на одну операцию больше ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог