RegExp - найти набор однотипных строк, между которых может быть произвольная строка

С помощью регулярных выражений PosgreSQL нужно определить, есть ли в тексте фиксированное количество пронумерованных строк (не больше и не меньше), начинающихся на определенную последовательность. Например, есть ли в тексте ровно 6 одинаковых строк, начинающихся на число + //:

texttexttext

1// texttexttext
2// texttexttext
3// texttexttext
4// texttexttext
5// texttexttext
6// texttexttext
texttexttext
texttexttext
texttexttext
texttexttext

Сейчас ищу таким выражением:

(\n[1-6][//|\\|.| |)][^\n]+){6}\n(\D[^\n]+\n)*((?!7))

Но оно не срабатывает, если между пронумерованными строками есть произвольные строки:

texttexttext

1// texttexttext
2// texttexttext
3// texttexttext
texttexttext
texttexttext
4// texttexttext
5// texttexttext
6// texttexttext
texttexttext
texttexttext
texttexttext
texttexttext

Таких строк в середине может быть от 1 до 3 подряд, эта последовательность может быть только 1 раз. Есть ли возможность учесть эту ситуацию в регулярном выражении?


Ответы (1 шт):

Автор решения: Ainar-G

Вы можете просто выбрать строчки, где число совпадений равно 6. Это можно сделать с помощью комбинации функции regexp_matches и бокового перекрёстного соединения (англ. «lateral cross join»). Пример:

SELECT t.id
  FROM t
       CROSS JOIN LATERAL
         regexp_matches(t.a, '^a', 'gn')
       AS u(m)
 GROUP BY t.id
HAVING COUNT(u.m) = 3
;

Данный запрос выведет ID строчки из таблицы t, где текст (колонка a) содержит ровно три строчки, начинающихся с латинской буквы a.

→ Ссылка