Регулярное выражение для совпадения строки, превышающей длину, но исключая совпадение в конце

Как указано в заголовке, я ищу регулярное выражение, которое будет соответствовать строке, превышающей заданную длину, поэтому:

[\s\S]{51,}

Таким образом, следующее будет соответствовать:

Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo.

И следующее не будет:

Vestibulum volutpat pretium libero.

Тем не менее, я хочу дополнительное условие, что определенная последовательность символов, появляющаяся в конце строки, должна быть исключена из числа символов. Сама эта последовательность может быть определена с помощью регулярного выражения. Например:

something\/[\w]+\/at-the-end\/[\d]+$

Таким образом, следующее должно соответствовать:

Cras risus ipsum, faucibus ut, ullamcorper id, varius ac, leo.

И следующее все равно не должно:

Vestibulum volutpat pretium libero. something/random/at-the-end/12345

Я думаю, что если это вообще возможно, это каким-то образом подразумевает обходные пути, но я не знаю, как бы я это сделал. Я ищу решение с использованием одного регулярного выражения.

2 ответа

Решение

Вы можете попытаться использовать отрицательный взгляд, чтобы умерить соответствие шаблона:

^((?!at-the-end\/\d+)[\s\S]){51,}[\s\S]*$

демонстрация

Основная идея шаблона заключается в том, что он будет потреблять любой отдельный символ до тех пор, пока at-the-end/, за которым следует одна или несколько цифр, за которыми следует конец строки.

Не красиво, но это регулярное выражение работает даже в JavaScript:

^(.{51,}(?:something\/[\w]+\/at-the-end\/[\d]+$))|((?!.*something\/[\w]+\/at-the-end\/[\d]+$).{51,})$

Он ищет строку, которая заканчивается случайным материалом, за которым следует не менее 51 символа.
Или он ищет не менее 51 символа, но без случайных вещей в конце.

Вы можете проверить это здесь

С помощью механизма регулярных выражений PCRE вы используете заранее определенный шаблон для этого случайного материала.

(?(DEFINE)(?<random>something\/[\w]+\/at-the-end\/[\d]+$))^(.{51,}(?P>random))|((?!.*(?P>random)).{51,})$
Другие вопросы по тегам