Xpoint
   [напомнить пароль]

помогите составить регулярное выражение

Метки: [без меток]
2011-08-21 04:07:13 [обр] August[досье]

в общем-то простая задача, но никак не получается решить.
требуется извлечь из строки подстроку, ограниченную определенными символами. ограничители эти - пара '%?' слева и пара '?%' справа.
пример:
дана строка

s = "aaa%?sss?%ggg"

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

re = /%\?(.*?)\?%/g

проверяем

re.test (s)
alert (RegExp.$1)

получаем "sss" - то, что нам нужно.
но если у нас вложенные параметры, то это регулярное выражение уже не работает.
пример

s = "aaa %?sss%?ddd?%fff?%ggg"
re = /%\?(.*?)\?%/g
re.test (s)
alert (RegExp.$1)

на экран будет выведено "sss%?ddd", что неправильно, должно быть "ddd".
сложность заключается еще и в том, что строка может содержать любые символы, в т.ч. и '%' и '?', поэтому регуляку вида "[^%?]" использовать нельзя.
прошу помощи в составлении регулярного выражения, надеюсь все понятно описал.

спустя 5 часов [обр] Александр Михалицын(10/16)[досье]
сообщение промодерировано
Боюсь, одной регуляркой вы тут не обойдетесь.
Используйте цикл со счетчиком открытых/закрытых границ подстрок.
А уже в нём выдирайте всё регуляркой до следующей последовательности (%?/?%).
спустя 2 дня 1 час [обр] Jared(6/26)[досье]
Это же классическая задача разбора строки вида " A and (B or (C and D)) " с разделителями в виде скобок. За решением - в гугл =)...
спустя 1 день 17 часов [обр] August[досье]
Jared[досье], если нечего сказать, лучше промолчать.
здесь разделителем является пара символов, что усложняет составление регулярки, т.к. в регулярке нет операции "если строка не совпадает", только символ
спустя 17 часов [обр] Jared(6/26)[досье]

August[досье] Ваши "%?" и "?%" можно заменить на один символ, гарантированно не встречающийся в исходной строке.
http://forum.vingrad.ru/topic-192355.html
http://habrahabr.ru/blogs/ruby/50749/

...и сотни еще.

спустя 18 часов [обр] August[досье]
Jared[досье] вы предлагаете перед парсингом сделать замены строк? если это так.. отличный метод.. ничего не скажешь. проценты у меня еще используются для выделения переменных вида %NAME%.
а теперь что получится если делать предварительную замену в такой строке?
%?aaa %NAME%?%
спустя 10 часов [обр] Jared(6/26)[досье]

August[досье] вы шутите чтоли?
В терминах js, чтобы не кому не было обидно (код не тестировал *\):

str =  'val percent is 50% while var is %var% and some data is %?data %?subsubdata?% blabla 4 1st lvl ?%'; // Исходная строка
str = str.replace(/%\?/, '(').replace(/\?%/, ')'); // Конвертим двухсимвольные литералы в односимвольные
str; // == val percent is 50% while var is %var% and some data is (data (subsubdata) blabla 4 1st lvl )
str; // Готова к парсингу по алгоритмам указанным выше.... или любым и другими, которык вы найдете...

Более того, в приведенном коде вторую строку ГОРАЗДО эффективнее с точки зрения производительности реализовать через свой код (с использованием indexOf, substring), а не через регэкспы.
Символ процента сам по себе ни во что не преобразовывается... Изменения затрагивают только последовательности "%?" и "?%".

И, как уже было сказано, простыми регэкспами ваша проблема не решается... Я уже показал Вам, как она сводится к классической... и дал ссылки на пару вариантов решения..

спустя 5 часов [обр] Филипп Ткачев(6/115)[досье]
Powered by POEM™ Engine Copyright © 2002-2005