Please enable JavaScript to use regex101
/
^
r
e
g
e
x
[
\
-
_
]
?
1
0
1
$
/
i
Reg
ular
Ex
pressions
101
Upgrade to Pro
Enterprise
Regular Expression
/
(?<!\n\d+)(?<=(?:^|\n)[^\n(]*(?:\([^\n(]*(?:\([^\n(]*(?:\([^\n(]*(?:\(.*\)[^\n()]*)*\)[^\n()]*)*\)[^\n()]*)*\)[^\n()]*)*)\)|\((?=(?:[^\n()]*\((?:[^\n()]*\((?:[^\n()]*\((?:[^\n()]*\(.*\))*[^\n)]*\))*[^\n)]*\))*[^\n)]*\))*[^\n)]*(?:\n|$))
/
g
Input 1
1
New
Требуется: 1) Фильтровать посты по наличию в них закрывающей скобки (далее ЗС) без парной ей открывающей скобки (далее ОС) в пределах одной строки, и наоборот; 2) Исключить из фильтрации нумерованные списки, символом после числа в которых будет ЗС (пример: этот список); 3) При поиске парных скобок учитывать вложенность (далее УВ) до 4 уровня (больше не вижу смысла, вряд ли на сопляче вы где-то встретите (НЕ в качестве копипасты для вайпа) научные труды, в которых нужна такая большая вложенность). Решение: 1) Для каждой из двух вариаций непарных скобок подфильтр будет отдельным, ибо направление поиска вложенных скобок у них будет противоположно направенным; 2) Поиск непарных скобок будет вестись: ОТ начала поста ИЛИ ближайшего переноса строки, ДО ближайшего переноса строки ИЛИ конца поста; 2) Для ЗС нужно исключениие. когда та сама является символом в списке. 4) ДЛЯ ЗАКРЫВАЮЩЕЙ СКОБКИ: 4.1. Проверить по п.2, что это не исключение; 4.2. УВ=1, искать в обратном направлении: парную ОС (==ЛОЖЬ), ограничитель поиска (по п.2) (==ИСТИНА), вторую непарную ЗС (УВ+1, см.след.пп.); 4.3. УВ=2, искать в обратном направлении: парную ОС (УВ-1, см.пред.пп.), ограничитель поиска (==ИСТИНА), третью непарную ЗС (УВ+1, см.след.пп.); 4.4. УВ=3, искать в обратном направлении: парную ОС (УВ-1, см.пред.пп.), ограничитель поиска (==ИСТИНА), четвёртую непарную ЗС (УВ+1, см.след.пп.); 4.5. УВ=4, искать в обратном направлении: парную ОС (УВ-1, см.пред.пп.), ограничитель поиска (==ИСТИНА), пятую непарную ЗС (==ИСТИНА). 5) ДЛЯ ОТКРЫВАЮЩЕЙ СКОБКИ: 5.1 УВ=1, искать в прямом направлении: парную ЗС (==ЛОЖЬ), ограничитель поиска (по п.2) (==ИСТИНА), вторую непарную ОС (УВ+1, см.след.пп.); 5.2 УВ=2, искать в прямом направлении: парную ЗС (УВ-1, см.пред.пп.), ограничитель поиска (==ИСТИНА), третью непарную ОС (УВ+1, см.след.пп.); 5.3 УВ=3, искать в прямом направлении: парную ЗС (УВ-1, см.пред.пп.), ограничитель поиска (==ИСТИНА), четвёртую непарную ОС (УВ+1, см.след.пп.); 5.4 УВ=4, искать в прямом направлении: парную ЗС (УВ-1, см.пред.пп.), ограничитель поиска (==ИСТИНА), пятую непарную ОС (=ИСТИНА). Проверка: 1) Не обнаружено: (1) (1(2)1(2)1) (1(2(3)2(3)2)1) (1(2(3(4)3(4)3)2)1) 2) Обнаружено: (1(2(3(4(5)4(5)4)3)2)1) скобкодаун тешится))) скобкодаун грустит((( 2.1) сложная нумерация а) буквенная нумерация (фильтру будет сложно объяснить, где буква+ЗС означает нумерацию, а где скобкодаунство) 22) нумерация не с начала строки (макаба жрёт начальные пробелы, так что шанс появления такого варианта близок к нулю) информация (в скобках на более чем одной строке) Итог: Как видно по проверочной секции, фильтр по прежнему имеет варианты ложнопозитивного срабатывания, однако вероятность их появления на сопляче исчезающе низка. В работе фильтра использованы такие хитрожопые технологии как Positive/Negative Lookahead/Lookbehind, которые ДОЛЖНЫ работать в последних версиях движков RegExp, но МОГУТ не работать лично у тебя, анон. У МЕНЯ ВСЁ РАБОТАЕТ (в кукле). Жалобы можешь писать Абу/Гуглу/Мозилле/Степану-куклоёбу/Наделле/Куку/Торвальдсу/Столлману/небу/Аллаху. Нутыпонел.