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

Они там делают полноценный разбор грамматики, который не сводится к регекспам (а может быть и вообще без них написан). Только регекспами сделать то, что ты хочешь, нельзя - они не для этого.
почему не для этого? Вполне даже себе показательный и интересный пример
Наверное потому, что регекспами невозможно это сделать.
может, я не совсем понял, что требуется...
$str = "Он пошел (точнее, побежал : ) ) ) быстрым шагом";
Отсюда требуется вытащить "точнее, побежал : ) ) " ?
$str = "Он пошел (точнее, побежал : ) ) ) быстрым шагом";
Отсюда требуется вытащить "точнее, побежал : ) ) " ?
Ну, я так понял, что надо вытащить из "тра-та-та ( тра-та та ( мы везём ) к тебе ) кота ( ча-ча-ча )"
"тра-та та ( мы везём ) к тебе", "мы везём" и "ча-ча-ча"
"тра-та та ( мы везём ) к тебе", "мы везём" и "ча-ча-ча"
аааааа
тогда да... рекурсиё
З.Ы. Причем в таком примере даже с рекурсией не очень понимаю, можно ли сделать
тогда да... рекурсиё
З.Ы. Причем в таком примере даже с рекурсией не очень понимаю, можно ли сделать
почему не для этого? Вполне даже себе показательный и интересный примерну вот тогда еще примеры:
выбрать все делящиеся на N числа из строки
выбрать все растущие подпоследовательности чисел ("4 5 1 2" -> "4 5" и "1 2")
ты хочешь чтобы регэкспы "думали"
а они всего лишь паттерн
.Net напримервроде тут об этом написано
http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx
$str = "Он пошел (точнее, побежал : ) ) ) быстрым шагом";Именно так.
Отсюда требуется вытащить "точнее, побежал : ) ) " ?
Ну, я так понял, что надо вытащить из "тра-та-та ( тра-та та ( мы везём ) к тебе ) кота ( ча-ча-ча )"Такого пока не надо - достаточно уметь получать к-й уровень этой иерархии.
"тра-та та ( мы везём ) к тебе", "мы везём" и "ча-ча-ча"
В данном случае мне достаточно самого первого.
Что ты хочешь получить применительно к этому выражению?
Вот пример выражения:
Результат должен быть такой:
То есть надо найти самые внешние вхождения [] и удалить их.
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
То есть надо найти самые внешние вхождения [] и удалить их.
x(a(b)c)d(e)f)y
И что же ты хочешь поймать?
(a(b)c)d(e)f)?
(a(b)c) и (e)f)?
И что же ты хочешь поймать?
(a(b)c)d(e)f)?
(a(b)c) и (e)f)?
Ну вот для этого регекспы и не предназначены.
Тебе нужен разбор грамматики. В твоём случае он будет довольно простой и его можно ручками написать. В более сложных случаях используют специальные инструменты, вроде яка.
Тебе нужен разбор грамматики. В твоём случае он будет довольно простой и его можно ручками написать. В более сложных случаях используют специальные инструменты, вроде яка.
То есть расстановка скобок у тебя все же правильная?
Хотя, если у тебя квадратные скобки только так могут быть использованны, то можно несколько раз удалить /\[[^\[]*\]/, пока есть что удалять. Но это всё равно через жопу и потом тебе этого начнёт не хватать, когда понадобится как-то умнее обрабатывать эти данные.
Именно так.брррр
так а чем тогда тебя не устраивает
?
/^.*?\.*?)\).*$/
З.Ы. Потом пример прочитал... ужаснулся
От приведенного примера останется
s11
Спасибо, это похоже то, что нужно 
Осталось в этом разобраться...

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

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

По крайней мере 100% совместимости у разных реализаций не бывает.Тут никто не говорит о 100% совместимости. Тут скорее принципиальное расхождение концепций.
Если уж на то пошло, то "реализация" регулярных выражений определена стандартом Posix, и 99%
программистов под выражением "регулярное выражение" будут понимать именно ее.
+1
RegExp есть RegExp, математическая конструкция с ограниченной степенью применимости. Если перл позволяет делать рекурсивные регекспы, это означает, только то, что в перле реализован комбайн из рекурсии и регэкспа, смысл регэкспа не меняется. Если нужна аналогичная функциональность, то оборачивай рекурсию вокруг регэкспа, получишь то, что тебе нужно.
RegExp есть RegExp, математическая конструкция с ограниченной степенью применимости. Если перл позволяет делать рекурсивные регекспы, это означает, только то, что в перле реализован комбайн из рекурсии и регэкспа, смысл регэкспа не меняется. Если нужна аналогичная функциональность, то оборачивай рекурсию вокруг регэкспа, получишь то, что тебе нужно.
Вы довольны новым названием темы?
К сожалению пока это все делается не программно, а руками в EditPad Pro.
Так что не все решения подходят.
Пока я решил задачу 2-мя регэкспами(не уверен, что правильно записываю замену):
1.
2.
Сначала до упора выполняется 1-е выражение - так оставляется только самый верхний уровень.
Потом 1 раз выполняется 2-е.
Проверил - вроде работает
Всем спасибо
Так что не все решения подходят.
Пока я решил задачу 2-мя регэкспами(не уверен, что правильно записываю замену):
1.
/(s\d{1,3}\[[^][]*)\[([^][]*)\]([^]]*\])/ --> /\1\2\3/ 2.
/(s\d{1,3})\[.+?\]+/ --> /\1/ Сначала до упора выполняется 1-е выражение - так оставляется только самый верхний уровень.
Потом 1 раз выполняется 2-е.
Проверил - вроде работает
Всем спасибо

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

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