Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342

ошибка в регулярке

27.03.2017, 21:59. Показов 1181. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть некоторая неточность в моей регулярке.

Суть такая - мне нужно из текста достать все строки вида:
X, где X - Это строка вида
@(id(val)), где id - строка, начиная с буквы и val - любая строка, которая может включает X.

Рекурсивное вложение обрабатываю и все получается.
Например:

@id1(Hello @id2(Boom)). Здесь парсер без проблем достает id и val и раскидывает их по группам (На скрине пример работы).
А вот если я ему дам строку @id1(Boom) @id2(Boom) он увидит id = 'id1' и val = 'Boom) @id2(Boom'. То есть он определяет эту строку как один X, а не как два (На скрине так же пример).

Собственно вот сама регулярка - @(\w[\w\d]+)\((.+)\)
Помогите доработать пожалуйста
Миниатюры
ошибка в регулярке   ошибка в регулярке   ошибка в регулярке  

0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2017, 21:59
Ответы с готовыми решениями:

Ошибка в регулярке
preg_match_all("\<td\>\<div\ class\=\"cell\-1\"\>\<a\ href\=\"\"\>(.*)\<\/a\>\<\/div\>",$data,$mch); Помогите найти ошибку, регулярное...

Ошибка в простой регулярке
Привет Друзья. Помогите найти ошибку. Уже не знаю что ещё сделать. // Проверка по регулярным выражениям bool __fastcall...

Интересная выдача (ошибка) в регулярке
Имеем скрипт: $H=getenv("HTTP_REFERER"); preg_match("/{8}-{4}-{4}-{4}-{12}.{5}/", $H, $go); // var_dump($go); // выводим весь...

6
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
27.03.2017, 22:32
Code
1
2
3
4
5
6
7
8
@(\w+)
\(
(
  (?: [^()]+
    | \( (?1) \)
  )*+
)
\)
https://regex101.com/r/8Fzyqc/1
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
27.03.2017, 23:53  [ТС]
Emilien, Большое Спасибо! В php все работает отлично, но надо мне эту же регулярку засунуть в c#. А он ругается на два парных символа - *+ (3 строка снизу). Можно ли их как нибудь переделать в более универсальную версию?
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
28.03.2017, 11:07
В той регулярке я ошибся. Нужно (?2) вместо (?1) для работы с большой вложенностью скобок.
Кроме ленивых квантификаторов *?, +?, ?? есть сверхжадные (possessive quantifiers) *+, ++, ?+.
Их можно заменить атомарной группировкой (?>...), но в C# нет рекусивных шаблонов (?R) (?1).
Возможно что-то похожее можно сделать используя balancing group
Если не нужно обрабатывать большую вложенность скобок вроде id(id(id(p))), то как-то так
Code
1
2
3
4
5
6
7
8
@(\w+)
\(
(
  (?> [^()]+
    | \( [^()]+ \)
  )*
)
\)
https://regex101.com/r/8Fzyqc/5
2
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
28.03.2017, 16:49  [ТС]
Цитата Сообщение от Emilien Посмотреть сообщение
Если не нужно обрабатывать большую вложенность скобок вроде id(id(id(p))), то как-то так
Мне, в принципе, все это подходит, так как рекурсия обрабатывается в коде. Только при большой вложенности он видит самую глубокую максимальную последовательность (то есть 2). А можно инвертировать ситуация и увидеть самую внешнюю последовательность?? Или регулярками это не получится?

Вот например - id(id(id(1))) он видит внутренние id(id(1)). А возможно увидеть id(id(id(1))) - целиком без внутреннего парсинга? (Внутренний делаю рекурсией на уровне кода)

Добавлено через 54 минуты
Как вариант сделать длинную регулярку с помощью ctrl-c, ctrl-v. Наверное, так и сделаю пока что. Сделаю максимальную вложенность 4-5 и просто копипастну рекурсивные части регулярки
0
1137 / 685 / 412
Регистрация: 07.11.2015
Сообщений: 1,102
28.03.2017, 19:56
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Реализовать используя balancing group вышло примерно так:
Code
1
2
3
4
5
(?x) @(\w+) (?<open> \( )
(?> (?<open> \( )
  | (?<-open> \) )
  | (?(open) [^()]+ | (?!) )
)+
http://rextester.com/RZT61284
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
28.03.2017, 21:51  [ТС]
Спасибо! То, что надо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2017, 21:51
Помогаю со студенческими работами здесь

Пробел в регулярке
Всем привет! Есть такой текст: &lt;div&gt; &lt;div&gt;Первый div&lt;/div&gt; &lt;div&gt;Текст&lt;/div&gt; &lt;div&gt;Текст&lt;/div&gt; &lt;div&gt;Текст&lt;/div&gt; ...

Подскажите по регулярке
Здравствуйте. Проблема в том, что моя регулярка срабатывает на сайте https://regex101.com/ Но отказывается срабатывать в скрипте на...

Исключения в регулярке
Есть регулярное выражение $pattern =...

Замена по регулярке не работает
хочю сделать замену ббкода &lt;?php $string=&quot;&quot;; $rep=&quot;/&lt;a&gt;/&quot;; if(preg_replace(&quot;//&quot;, $rep, $string)){echo('ok');} ...

обратный слеш в регулярке
добры вечер, естъ проблема в регулярке хачу такои штуку: если слова содержит толко симболи латинского алфавита (маленкие) и обратный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru