[реализации RegExp] Выражение для поиска парных скобок

durka82

На Перле это делается через рекурсию.
Но вот как это сделать на других движках RegEx-ов (.Net например)?
Пример использования:
Нужно получить выражение внутри скобок. Причем внутри выражения эти скобки могу использоваться.

pitrik2

имхо, нереал

durka82

То есть в редакторах (кроме написанных на Перле) отображение парной скобки делается исключительно через последовательный подсчет вхождений?
Бедные :(

sbs-66

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

uncle17

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

sbs-66

Наверное потому, что регекспами невозможно это сделать.

uncle17

может, я не совсем понял, что требуется...
$str = "Он пошел (точнее, побежал : ) ) ) быстрым шагом";
Отсюда требуется вытащить "точнее, побежал : ) ) " ?

sbs-66

Ну, я так понял, что надо вытащить из "тра-та-та ( тра-та та ( мы везём ) к тебе ) кота ( ча-ча-ча )"
"тра-та та ( мы везём ) к тебе", "мы везём" и "ча-ча-ча"

uncle17

аааааа
тогда да... рекурсиё
З.Ы. Причем в таком примере даже с рекурсией не очень понимаю, можно ли сделать

pitrik2

почему не для этого? Вполне даже себе показательный и интересный пример
ну вот тогда еще примеры:
выбрать все делящиеся на N числа из строки
выбрать все растущие подпоследовательности чисел ("4 5 1 2" -> "4 5" и "1 2")
ты хочешь чтобы регэкспы "думали"
а они всего лишь паттерн

6yrop

.Net например
вроде тут об этом написано
http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx

durka82

$str = "Он пошел (точнее, побежал : ) ) ) быстрым шагом";
Отсюда требуется вытащить "точнее, побежал : ) ) " ?
Именно так.

durka82

Ну, я так понял, что надо вытащить из "тра-та-та ( тра-та та ( мы везём ) к тебе ) кота ( ча-ча-ча )"
"тра-та та ( мы везём ) к тебе", "мы везём" и "ча-ча-ча"
Такого пока не надо - достаточно уметь получать к-й уровень этой иерархии.
В данном случае мне достаточно самого первого.

geja_03

Что ты хочешь получить применительно к этому выражению?

durka82

Вот пример выражения:
s11[m(j,i,k,2)*m(j-1,i-1,k,24)]-s12[m(j,i,k,3)*s9[m(j-1,i-1,k+1,23)]]

Результат должен быть такой:
s11-s12

То есть надо найти самые внешние вхождения [] и удалить их.

kruzer25

x(a(b)c)d(e)f)y
И что же ты хочешь поймать?
(a(b)c)d(e)f)?
(a(b)c) и (e)f)?

sbs-66

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

geja_03

То есть расстановка скобок у тебя все же правильная?

sbs-66

Хотя, если у тебя квадратные скобки только так могут быть использованны, то можно несколько раз удалить /\[[^\[]*\]/, пока есть что удалять. Но это всё равно через жопу и потом тебе этого начнёт не хватать, когда понадобится как-то умнее обрабатывать эти данные.

uncle17

Именно так.
брррр
так а чем тогда тебя не устраивает

/^.*?\.*?)\).*$/
?
З.Ы. Потом пример прочитал... ужаснулся

apl13

От приведенного примера останется
s11

durka82

Спасибо, это похоже то, что нужно :)
Осталось в этом разобраться...

durka82

Правильная.

durka82

Тоже вариант.

Oper

Убери из названия темы RegEx, не позорься.

durka82

Этто почему?
Потому, что надо было RegExp?

Oper

Потому что, регэкспами твоя задача не решается (это одно из первых упражнений в любом учебнике по формальным языкам). И это не независит от используемого языка программирования, как ни странно :grin:
Все ж таки о регулярные выражения придумали математики, а не программисты. Плохо, когда про это забывают.

durka82

Если рассматривать RegEx как мат абстракцию - это так.
Но RegEx можно рассматривать и как конкретные реализации этой абстракции.
А в них эта задача уже мб разрешима (Perl, .Net).
Кроме того, возможны неполные решения.

Oper

ну давайте еще машину Тьюринга назовем конечным автоматом. Какая разница, действительно, это ж так удобно ?

durka82

И как ты предлагаешь обзывать конкретные реализации регэкспов?

Oper

Мне пофег, я не специалист ни по perl, ни тем более по .net. Только путаницу в понятия вносить не следует, если есть желание, чтобы все друг друга понимали. Вот только представь, какая будет путаница, если в каждом языке будут свои регэкспы. Как при программировании использовать несколько языков программирования ?

durka82

Мне пофег
+1
Вот только представь, какая будет путаница, если в каждом языке будут свои регэкспы.
Вообще-то это суровая реальность.
По крайней мере 100% совместимости у разных реализаций не бывает.
Как при программировании использовать несколько языков программирования ?
Бывают среды разработки, которые такое позволяют.
Библиотека может быть создана на одном языке, а использоваться из другого.
Одна из идей .net вообще в том, что язык не имеет значения - на каком (из реализованных на .net) хотим, на таком и пишем, причем какая часть на каком языке лучше получается, на таком ее и пишем ;)

Oper

По крайней мере 100% совместимости у разных реализаций не бывает.
Тут никто не говорит о 100% совместимости. Тут скорее принципиальное расхождение концепций.
Если уж на то пошло, то "реализация" регулярных выражений определена стандартом Posix, и 99%
программистов под выражением "регулярное выражение" будут понимать именно ее.

geja_03

+1
RegExp есть RegExp, математическая конструкция с ограниченной степенью применимости. Если перл позволяет делать рекурсивные регекспы, это означает, только то, что в перле реализован комбайн из рекурсии и регэкспа, смысл регэкспа не меняется. Если нужна аналогичная функциональность, то оборачивай рекурсию вокруг регэкспа, получишь то, что тебе нужно.

durka82

Вы довольны новым названием темы?

durka82

К сожалению пока это все делается не программно, а руками в EditPad Pro.
Так что не все решения подходят.
Пока я решил задачу 2-мя регэкспами(не уверен, что правильно записываю замену):
1.
 /(s\d{1,3}\[[^][]*)\[([^][]*)\]([^]]*\])/ --> /\1\2\3/ 

2.
 /(s\d{1,3})\[.+?\]+/ --> /\1/  

Сначала до упора выполняется 1-е выражение - так оставляется только самый верхний уровень.
Потом 1 раз выполняется 2-е.
Проверил - вроде работает :)
Всем спасибо :)

durka82

Еще такой маленький вопросик - где-то видел, что можно включать в регекспы произвольные строки, которые ищутся буквально.
Но вот теперь никак найти не могу :(
Или я что-то перепутал?
Понятно, что можно везде слешей наставить, но все таки?

kruzer25

Понятно, что можно везде слешей наставить, но все таки?
В PHP, например, есть preg_quote($str). Наверняка в том языке, который ты используешь, тоже есть что-нибудь подобное.
Оставить комментарий
Имя или ник:
Комментарий: