Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть строка, включающая фрагменты-разделители " AND ", " OR ", " NOT ", "(", ")". Например: program AND fof AND NOT (5 OR 6 OR (8 AND ppp)) Из этой строки мне необходимо получить фрагменты: program fof 5 6 8 Дополнительные условия: а) извлечённые фрагменты не должны иметь пробелов слева или справа (в середине могут) б) регистр фрагментов-разделителей (" AND ", " OR ", " NOT ", "(", ")") неважен Каким должно быть регулярное выражение, чтобы извлечь эти фрагменты из строки ? Подумайте на досуге, у кого есть время... Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 18:38 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Ещё пара замечаний: в) если в строке фрагментов-разделителей не будет, то регулярное выражение должно вернуть всю исходную строку г) Если рядом стоят OR/AND/NOT и круглая скобка, то между ними пробелов может не быть: ...OR(... ...AND(... ...NOT(... ...(NOT... ...)OR... ...)AND... ...)NOT... ...NOT)... Во всех этих случаях фрагменты OR, AND, NOT, ), ( должны распознаваться как разделители. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 18:59 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Да, чуть не забыл. В перечне фрагментов, которые нужно получить, пропустил этот: ppp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 19:25 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Ну а что сложного то? Одной регуляркой этого делать не надо... Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Возможно, это можно сделать и оптимальнее, но это первое что в голову пришло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 19:51 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Скормить preg_split() всю пачку разделителей, затем в цикле по массиву сделать trim и выкинуть пустые элементы. Возможно, оно получится прожорливее чем вариант Программера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 21:13 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Програмёр , сабжевое регулярное выражение мне нужно для использования в preg_replace: все отобранные фрагменты будут заменены на другие фрагменты, зависящие от исходных. Поэтому, ничего Replace'ить не нужно. Нужно получить одно регулярное выражение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 21:48 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02 Програмёр , сабжевое регулярное выражение мне нужно для использования в preg_replace: все отобранные фрагменты будут заменены на другие фрагменты, зависящие от исходных. Поэтому, ничего Replace'ить не нужно. Нужно получить одно регулярное выражение. Так что же Вам нужно? :) В Вашем вопросе написано, что "Из этой строки мне необходимо получить фрагменты", и приведён список фрагментов. Мой код это делает, но он Вам не подходит. Мне например не по приколу сидеть и мутить "говно-регулярку", когда всё делается намного красивее, быстрее и быстродейственее. Задайте правильно вопрос и получите удовлетворяющий Вас ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 22:03 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторВ Вашем вопросе написано, что "Из этой строки мне необходимо получить фрагменты", и приведён список фрагментов. Мой код это делает, но он Вам не подходит. Вы упомянули только первую часть вопроса. А ещё есть вторая часть вопроса: на основе регулярного выражения. Ну а почему именно на основе регулярки - это уже другой вопрос: Есть исходная строка: 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..., исходнаяСтрока ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 23:36 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Есть исходная строка: program AND fof AND NOT (5 OR 6 OR (8 AND ppp)) Уточните, структура этой строки всегда одинакова? В том смысле, что шаблон "ххх AND ххх AND NOT (х OR х OR (х AND ххх))" остается всегда неизменным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2013, 23:53 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
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. Хотя мне это смахивает на какое-то извращение. Но раз именно регуляркой... тогда так :) Если кто-то сможет оптимальнее составить - будет круто, а то от чтения "этого" мозг кипит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 02:15 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторУточните, структура этой строки всегда одинакова? В том смысле, что шаблон "ххх 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)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 11:08 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
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 использовал, что бы отдельную группу можно было подменить, а не всю строку). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 11:16 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, Вы сам код запустите, который я привёл. Там всё верно работает, а после запуска сразу понятно что и где делается :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 11:17 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Всё, разобрался. Только вот один сюрприз всё-таки имеется)) Если обработать вот такие строки: автор(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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 14:56 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Можно, конечно, эту скобку удалять в callback-функции, но это не совсем корректный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 14:57 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
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. закрывающие скобки (если есть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 15:50 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Вот на этой строке: Код: php 1. в 6-й группе получаем: Код: php 1. http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *))(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=(program OR fff) AND 666 or (NoT ttt) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 16:27 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Вот на этой строке: Код: php 1. в 6-й группе получаем: Код: php 1. 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 16:53 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Не только после скобки, но и вначале: http://regexpr.ru/?pattern=#((?: *(\bAND\b|\bOR\b) *(\bNOT\b *)?|^)(\(* *)(\bNOT\b *)?)(. ?)( *\)*)?(?= *(?:\bAND\b|\bOR\b|$))#i&subject=NOT (ttt AND fff) Здесь 6-я группа с открывающей скобкой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 17:01 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
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) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 20:14 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 22:34 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 22:39 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
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)) Но это же уже этап отладки ))) хотя думаю это всё (хотя, если появится вариант, который не пройдёт - пишите... авось кому в будущем такая понадобится регулярка)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2013, 22:51 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторНо это же уже этап отладки ))) Да, просто в регулярках я полностью пока не разобрался (времени много требует). А до тех пор за реальные регулярки не берусь .. по принципу "авось, да получится". Разве что самые простые. авторхотя думаю это всё Да, вроде, всё учтено. Окончательный вариант: Код: php 1. Всё-таки, составили. Отлично. На другом форуме ниасилили . Букв много. ---------------------------------------------------------------------- Напоследок дайте оценку этой регулярки по 10-бальной. И приведите, если есть под рукой, самую сложную регулярку, с которой вы сталкивались. Интересно посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2013, 18:21 |
|
||
|
Элементарное регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02авторНо это же уже этап отладки ))) Да, просто в регулярках я полностью пока не разобрался (времени много требует). А до тех пор за реальные регулярки не берусь .. по принципу "авось, да получится". Разве что самые простые. авторхотя думаю это всё Да, вроде, всё учтено. Окончательный вариант: Код: php 1. Всё-таки, составили. Отлично. На другом форуме ниасилили . Букв много. ---------------------------------------------------------------------- Напоследок дайте оценку этой регулярки по 10-бальной. И приведите, если есть под рукой, самую сложную регулярку, с которой вы сталкивались. Интересно посмотреть. Не сразу сообразил... А вопрос вообще к форумчанам или лично ко мне? :) Если ко мне - то данная регулярка одна из самых сложных, которые приходилось писать (такие регулярки очень редко требуются, лично мне). А по 10-ти бальной системе я бы её оценил в баллов 7... Работает, но считаю, что написать можно и лучше (хотя кто знает ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2013, 23:10 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38358911&tid=1463534]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
33ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 307ms |

| 0 / 0 |
