powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Элементарное регулярное выражение
25 сообщений из 25, страница 1 из 1
Элементарное регулярное выражение
    #38358730
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Есть строка, включающая фрагменты-разделители " AND ", " OR ", " NOT ", "(", ")". Например:
program AND fof AND NOT (5 OR 6 OR (8 AND ppp))

Из этой строки мне необходимо получить фрагменты:
program
fof
5
6
8

Дополнительные условия:
а) извлечённые фрагменты не должны иметь пробелов слева или справа (в середине могут)
б) регистр фрагментов-разделителей (" AND ", " OR ", " NOT ", "(", ")") неважен

Каким должно быть регулярное выражение, чтобы извлечь эти фрагменты из строки ?
Подумайте на досуге, у кого есть время...
Заранее спасибо.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358758
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё пара замечаний:
в) если в строке фрагментов-разделителей не будет, то регулярное выражение должно вернуть всю исходную строку

г) Если рядом стоят OR/AND/NOT и круглая скобка, то между ними пробелов может не быть:
...OR(...
...AND(...
...NOT(...
...(NOT...
...)OR...
...)AND...
...)NOT...
...NOT)...
Во всех этих случаях фрагменты OR, AND, NOT, ), ( должны распознаваться как разделители.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358782
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, чуть не забыл. В перечне фрагментов, которые нужно получить, пропустил этот:
ppp
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358811
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а что сложного то? Одной регуляркой этого делать не надо...
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$text = "program AND fof AND NOT (5 OR 6 OR (8 AND ppp))";
$res = explode(
         " AND ", 
		 trim(
		   preg_replace(
		     array("# *([\\(\\)]|NOT) *#i", "# *(OR|AND) *#i"), 
		     array(" ", " AND "), 
		     $text
		   )
		 )
	   );
var_dump($res);



Возможно, это можно сделать и оптимальнее, но это первое что в голову пришло
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358878
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скормить preg_split() всю пачку разделителей, затем в цикле по массиву сделать trim и выкинуть пустые элементы. Возможно, оно получится прожорливее чем вариант Программера.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358902
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр , сабжевое регулярное выражение мне нужно для использования в preg_replace: все отобранные фрагменты будут заменены на другие фрагменты, зависящие от исходных. Поэтому, ничего Replace'ить не нужно. Нужно получить одно регулярное выражение.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358911
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02 Програмёр , сабжевое регулярное выражение мне нужно для использования в preg_replace: все отобранные фрагменты будут заменены на другие фрагменты, зависящие от исходных. Поэтому, ничего Replace'ить не нужно. Нужно получить одно регулярное выражение.

Так что же Вам нужно? :) В Вашем вопросе написано, что "Из этой строки мне необходимо получить фрагменты", и приведён список фрагментов. Мой код это делает, но он Вам не подходит. Мне например не по приколу сидеть и мутить "говно-регулярку", когда всё делается намного красивее, быстрее и быстродейственее.

Задайте правильно вопрос и получите удовлетворяющий Вас ответ.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358968
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ Вашем вопросе написано, что "Из этой строки мне необходимо получить фрагменты", и приведён список фрагментов. Мой код это делает, но он Вам не подходит.
Вы упомянули только первую часть вопроса. А ещё есть вторая часть вопроса: на основе регулярного выражения.

Ну а почему именно на основе регулярки - это уже другой вопрос:
Есть исходная строка:
program AND fof AND NOT (5 OR 6 OR (8 AND ppp))

Нужно получить:
более сложное выраж1 AND более сложное выраж2 AND NOT ( более сложное выраж3 OR более сложное выраж4 OR ( более сложное выраж5 AND более сложное выраж6 ))

Желательно сделать это функцией:
preg_replace( регВыражение , ...$0..., исходнаяСтрока )
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38358982
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Есть исходная строка:
program AND fof AND NOT (5 OR 6 OR (8 AND ppp)) Уточните, структура этой строки всегда одинакова? В том смысле, что шаблон "ххх AND ххх AND NOT (х OR х OR (х AND ххх))" остается всегда неизменным.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359041
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторВ Вашем вопросе написано, что "Из этой строки мне необходимо получить фрагменты", и приведён список фрагментов. Мой код это делает, но он Вам не подходит.
Вы упомянули только первую часть вопроса. А ещё есть вторая часть вопроса: на основе регулярного выражения.

Ну а почему именно на основе регулярки - это уже другой вопрос:
Есть исходная строка:
program AND fof AND NOT (5 OR 6 OR (8 AND ppp))

Нужно получить:
более сложное выраж1 AND более сложное выраж2 AND NOT ( более сложное выраж3 OR более сложное выраж4 OR ( более сложное выраж5 AND более сложное выраж6 ))

Желательно сделать это функцией:
preg_replace( регВыражение , ...$0..., исходнаяСтрока )

если правильно понял, то так:
Код: php
1.
2.
3.
4.
5.
6.
7.
function my_func($matches){
return $matches[1]."replaced_".$matches[6].$matches[7];
}
echo preg_replace_callback(
  "#( *(\bAND\b|\bOR\b) *(\bNOT\b *)?(\(* *)?|(^))(.+?)( *\)*)?(?= *(\bAND\b|\bOR\b|$))#i", 
  my_func,
  "program AND fof AND NOT (5 OR 6 OR (8 AND ppp))");


Хотя мне это смахивает на какое-то извращение. Но раз именно регуляркой... тогда так :) Если кто-то сможет оптимальнее составить - будет круто, а то от чтения "этого" мозг кипит.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359323
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУточните, структура этой строки всегда одинакова? В том смысле, что шаблон "ххх AND ххх AND NOT (х OR х OR (х AND ххх))" остается всегда неизменным.
Нет, структура будет произвольной. Строку "program AND fof AND NOT (5 OR 6 OR (8 AND ppp))" я привёл в качестве примера, что было понятно.


Програмёр , супер-регулярка у Вас получилась. Отлично. Только вот в найденные фрагменты она включает также и разделители:
#( *(\bAND\b|\bOR\b) *(\bNOT\b *)?(\(* *)?|(^))(.+?)( *\)*)?(?= *(\bAND\b|\bOR\b|$))#i

Совпадения :
program
AND fof
AND NOT ( 5
OR 6
OR ( 8
AND ppp ))

Проверял вот здесь:
http://regexpr.ru/?pattern=#( *(\bAND\b|\bOR\b) *(\bNOT\b *)?(\(* *)?|(^))(. ?)( *\)*)?(?= *(\bAND\b|\bOR\b|$))#i&subject=program AND fof AND NOT (5 OR 6 OR (8 AND ppp))
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359335
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторУточните, структура этой строки всегда одинакова? В том смысле, что шаблон "ххх AND ххх AND NOT (х OR х OR (х AND ххх))" остается всегда неизменным.
Нет, структура будет произвольной. Строку "program AND fof AND NOT (5 OR 6 OR (8 AND ppp))" я привёл в качестве примера, что было понятно.


Програмёр , супер-регулярка у Вас получилась. Отлично. Только вот в найденные фрагменты она включает также и разделители:
#( *(\bAND\b|\bOR\b) *(\bNOT\b *)?(\(* *)?|(^))(.+?)( *\)*)?(?= *(\bAND\b|\bOR\b|$))#i

Совпадения :
program
AND fof
AND NOT ( 5
OR 6
OR ( 8
AND ppp ))

Проверял вот здесь:
http://regexpr.ru/?pattern=#( *(\bAND\b|\bOR\b) *(\bNOT\b *)?(\(* *)?|(^))(. ?)( *\)*)?(?= *(\bAND\b|\bOR\b|$))#i&subject=program AND fof AND NOT (5 OR 6 OR (8 AND ppp))

то, что Вам надо лежит в группе с номером 6 )). Я же пример привёл, как использовать (специально callback использовал, что бы отдельную группу можно было подменить, а не всю строку).
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359337
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Вы сам код запустите, который я привёл. Там всё верно работает, а после запуска сразу понятно что и где делается :)
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359788
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё, разобрался. Только вот один сюрприз всё-таки имеется))
Если обработать вот такие строки:
автор(program AND fff) OR 666
(program OR fff) AND 666

то предваряющая скобка окажется в 6-й группе:
автор(program

http://regexpr.ru/?pattern=#( *(\bAND\b|\bOR\b) *(\bNOT\b *)?(\(* *)?|(^))(. ?)( *\)*)?(?= *(\bAND\b|\bOR\b|$))#i&subject=(program OR fff) AND 666
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359790
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно, эту скобку удалять в callback-функции, но это не совсем корректный вариант.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359895
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Можно, конечно, эту скобку удалять в callback-функции, но это не совсем корректный вариант.

подправил :) Конечно в такой регулярке разобраться очень сложно.
http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *))(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(program OR fff) AND 666

Я оставил все группы, которые могут потребоваться, но если захочется более чистый выход получать, то любую из них можно удалить из результата добавив ?: сразу после скобки (хотя думаю Вы знаете, просто если нет, то эту инфу сам очень долго по нэту искал).
по группам:
1. Всё от предыдущей искомой строки до найденной сейчас (для удобства обработки)
2. предшествующие OR|AND (если есть)
3. предшествующий NOT (если есть)
4. открывающие скобки (если есть)
5. искомая строка
6. закрывающие скобки (если есть)
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38359965
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот на этой строке:
Код: php
1.
(program OR fff) AND 666 or (NoT ttt)



в 6-й группе получаем:
Код: php
1.
NOT ttt



http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *))(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(program OR fff) AND 666 or (NoT ttt)
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38360010
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Вот на этой строке:
Код: php
1.
(program OR fff) AND 666 or (NoT ttt)



в 6-й группе получаем:
Код: php
1.
NOT ttt



http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *))(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(program OR fff) AND 666 or (NoT ttt)

Не подумал, что NOT может находиться после скобки, как отрицание первого элемента выражения. поправил:
http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *)(\bNOT\b *)?)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(program OR NOT fff) AND 666 or (NoT ttt)
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38360025
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не только после скобки, но и вначале:
http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *)(\bNOT\b *)?)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=NOT (ttt AND fff)

Здесь 6-я группа с открывающей скобкой
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38360183
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Не только после скобки, но и вначале:
http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *)(\bNOT\b *)?)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=NOT (ttt AND fff)

Здесь 6-я группа с открывающей скобкой

http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *|^)(\bNOT\b *)?(\(* *)(\bNOT\b *)?)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=NOT (ttt AND fff)
:)
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38360266
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38360271
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38360278
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Либо вот так:
http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *|^)(\bNOT\b *)?(\(* *)(\bNOT\b *)?)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(NOT (ttt AND fff) OR 666) AND (ggfgf OR NOT yyyyyyyyyyyyyyyyy))

http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *|^)(\bNOT\b *)?(\(* *(\bNOT\b *)?)*)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(NOT (ttt AND fff) OR 666) AND (ggfgf OR NOT yyyyyyyyyyyyyyyyy))

Но это же уже этап отладки ))) хотя думаю это всё (хотя, если появится вариант, который не пройдёт - пишите... авось кому в будущем такая понадобится регулярка)...
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38361470
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо это же уже этап отладки )))
Да, просто в регулярках я полностью пока не разобрался (времени много требует). А до тех пор за реальные регулярки не берусь .. по принципу "авось, да получится". Разве что самые простые.

авторхотя думаю это всё
Да, вроде, всё учтено. Окончательный вариант:
Код: php
1.
#((?: *(\bAND\b|\bOR\b) *|^)(\bNOT\b *)?(\(* *(\bNOT\b *)?)*)(.+?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i


Всё-таки, составили. Отлично. На другом форуме ниасилили . Букв много.

----------------------------------------------------------------------
Напоследок дайте оценку этой регулярки по 10-бальной.
И приведите, если есть под рукой, самую сложную регулярку, с которой вы сталкивались. Интересно посмотреть.
...
Рейтинг: 0 / 0
Элементарное регулярное выражение
    #38361643
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторНо это же уже этап отладки )))
Да, просто в регулярках я полностью пока не разобрался (времени много требует). А до тех пор за реальные регулярки не берусь .. по принципу "авось, да получится". Разве что самые простые.

авторхотя думаю это всё
Да, вроде, всё учтено. Окончательный вариант:
Код: php
1.
#((?: *(\bAND\b|\bOR\b) *|^)(\bNOT\b *)?(\(* *(\bNOT\b *)?)*)(.+?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i


Всё-таки, составили. Отлично. На другом форуме ниасилили . Букв много.

----------------------------------------------------------------------
Напоследок дайте оценку этой регулярки по 10-бальной.
И приведите, если есть под рукой, самую сложную регулярку, с которой вы сталкивались. Интересно посмотреть.

Не сразу сообразил... А вопрос вообще к форумчанам или лично ко мне? :)
Если ко мне - то данная регулярка одна из самых сложных, которые приходилось писать (такие регулярки очень редко требуются, лично мне). А по 10-ти бальной системе я бы её оценил в баллов 7... Работает, но считаю, что написать можно и лучше (хотя кто знает ).
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Элементарное регулярное выражение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]