[реализации RegExp] Выражение для поиска парных скобок
имхо, нереал
Бедные
Они там делают полноценный разбор грамматики, который не сводится к регекспам (а может быть и вообще без них написан). Только регекспами сделать то, что ты хочешь, нельзя - они не для этого.
почему не для этого? Вполне даже себе показательный и интересный пример
Наверное потому, что регекспами невозможно это сделать.
$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
То есть надо найти самые внешние вхождения [] и удалить их.
И что же ты хочешь поймать?
(a(b)c)d(e)f)?
(a(b)c) и (e)f)?
Тебе нужен разбор грамматики. В твоём случае он будет довольно простой и его можно ручками написать. В более сложных случаях используют специальные инструменты, вроде яка.
То есть расстановка скобок у тебя все же правильная?
Хотя, если у тебя квадратные скобки только так могут быть использованны, то можно несколько раз удалить /\[[^\[]*\]/, пока есть что удалять. Но это всё равно через жопу и потом тебе этого начнёт не хватать, когда понадобится как-то умнее обрабатывать эти данные.
Именно так.брррр
так а чем тогда тебя не устраивает
?
/^.*?\.*?)\).*$/
З.Ы. Потом пример прочитал... ужаснулся
s11
Осталось в этом разобраться...
Правильная.
Тоже вариант.
Убери из названия темы RegEx, не позорься.
Потому, что надо было RegExp?
Все ж таки о регулярные выражения придумали математики, а не программисты. Плохо, когда про это забывают.
Но RegEx можно рассматривать и как конкретные реализации этой абстракции.
А в них эта задача уже мб разрешима (Perl, .Net).
Кроме того, возможны неполные решения.
ну давайте еще машину Тьюринга назовем конечным автоматом. Какая разница, действительно, это ж так удобно ?
И как ты предлагаешь обзывать конкретные реализации регэкспов?
Мне пофег, я не специалист ни по perl, ни тем более по .net. Только путаницу в понятия вносить не следует, если есть желание, чтобы все друг друга понимали. Вот только представь, какая будет путаница, если в каждом языке будут свои регэкспы. Как при программировании использовать несколько языков программирования ?
Мне пофег+1
Вот только представь, какая будет путаница, если в каждом языке будут свои регэкспы.Вообще-то это суровая реальность.
По крайней мере 100% совместимости у разных реализаций не бывает.
Как при программировании использовать несколько языков программирования ?Бывают среды разработки, которые такое позволяют.
Библиотека может быть создана на одном языке, а использоваться из другого.
Одна из идей .net вообще в том, что язык не имеет значения - на каком (из реализованных на .net) хотим, на таком и пишем, причем какая часть на каком языке лучше получается, на таком ее и пишем
По крайней мере 100% совместимости у разных реализаций не бывает.Тут никто не говорит о 100% совместимости. Тут скорее принципиальное расхождение концепций.
Если уж на то пошло, то "реализация" регулярных выражений определена стандартом Posix, и 99%
программистов под выражением "регулярное выражение" будут понимать именно ее.
RegExp есть RegExp, математическая конструкция с ограниченной степенью применимости. Если перл позволяет делать рекурсивные регекспы, это означает, только то, что в перле реализован комбайн из рекурсии и регэкспа, смысл регэкспа не меняется. Если нужна аналогичная функциональность, то оборачивай рекурсию вокруг регэкспа, получишь то, что тебе нужно.
Вы довольны новым названием темы?
Так что не все решения подходят.
Пока я решил задачу 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 например)?
Пример использования:
Нужно получить выражение внутри скобок. Причем внутри выражения эти скобки могу использоваться.