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 шт):
Вы можете просто выбрать строчки, где число совпадений равно 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.