как найти "крайние" скобки?
Код:
{блок {перед} блоком} Текст {скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1} еще {второй блок}
какое регулярное выражение можно использовать, чтобы получить вот это
{блок {перед} блоком}
{скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1}
{второй блок}
два часа просидел, так и не смог ничего придумать :(
Цитата: JB13
Все знают регулярное выражение, чтобы найти самые вложенные скобки. А кто-нибудь знает, как найти самые "крайние" скобки? т.е. есть скажем такой текст
какое регулярное выражение можно использовать, чтобы получить вот это
{блок {перед} блоком}
{скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1}
{второй блок}
два часа просидел, так и не смог ничего придумать :(
Код:
{блок {перед} блоком} Текст {скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1} еще {второй блок}
какое регулярное выражение можно использовать, чтобы получить вот это
{блок {перед} блоком}
{скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1}
{второй блок}
два часа просидел, так и не смог ничего придумать :(
Необязательно это делать при помощи регулярных выражений
Есть теория по поводу интерпретаторов компиляторов.
Ключевые слова - "польская запись". На этой основе, ты сможешь выбрать блоки абсолютно любой вложенности или последовательности
Думал я еще над регулярным выражением, и мне кажеться что это невозможно, т.к. нельзя точно описать границы "крайних" скобок, их можно только подсчитать, а это, насколько я знаю, с помощью регулярных выражений не сделаешь :(
Попробую на пхп последовательно перебирать все символы, посмотрю насколько медленно получиться.
Сам разбор прост и вне имеет длиных операций. Да и такой код можно поддерживать с куда меньшими силами силами чем регулярные выражения ;)=
Код:
$ereg = "{блок {перед} блоком} Текст {скобки1 {скобки2 {скобки3 конец3} {скобки3.1 конец3.1} конец2} конец1} еще {второй блок}";
Код:
echo "{второй блок}:<br>";
preg_match("/((\{[\w\ \{]+\}))$/",$ereg,$match);
echo($match[0]);
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]
Попробуй модифицировать ;)
условие задачи, запросто :)=
Цитата: ReDrum
условие задачи, запросто :)=
Это к чему относится? :)
Наверняка вы догадываетесь, что существуют варианты в которых будет куда больше последовательностей или вложенностей скобок. И общее решение задачи с помошью рерулярного выражения будет сложным ;)=
Перебрал 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
$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 (все локально). Компьютер был загружен антивиром, файрволом, аськой, почтой и что-то качалось :)
У меня похожий вопрос, но нужно узнать всего лишь количество совпадений.
С помощью регулярных выражений можно посчитать количество вхождений подстроки в строку? (на php)
п.с. не стал создавать новую тему
Цитата: Poltos
С помощью регулярных выражений можно посчитать количество вхождений подстроки в строку?
preg_match_all() даст тебе массив совпадений. Количество элементов массива сможешь найти? ;)
preg_match_all(), с помощью ее знаю, но мне нужно только количество, без промежуточного результата. Для экономии памяти да и времени.
Оптимизация? Знаю-знаю. Сам этим болел... :) Читай здесь:
Цитата: shine
Оптимизация? Знаю-знаю. Сам этим болел... :) Читай здесь: http://rsdn.ru/article/philosophy/Optimization.xml
Да...было дело...болел, но успешно выздоровел :D
2 shine, RussianSpy Нет не оптимизация уменя, просто другая задача поставлена, где не нужен промежуточный результат и соответственно зачем зря грузить машину. Темболее при неоднократных вызовах функции совсем каша получется, а потом как раз и нужно будет оптимизировать, не хочу два раза одну и ту же работу делать. оО
Poltos, не бойся грузить машину. Ты же не будешь свою функцию вызывать миллиарды раз в секунду? Поэтому ничего с твоей машиной не случиться если она выполнит на одну операцию больше ;)