Регулярное выражение для совпадения строки, превышающей длину, но исключая совпадение в конце
Как указано в заголовке, я ищу регулярное выражение, которое будет соответствовать строке, превышающей заданную длину, поэтому:
[\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,})$