Если вам нужно только, чтобы строка не заканчивалась на .jpg
или .png
, вы можете использовать это:
^.+$(?<!\.jpg)(?<!\.png)
^.+
не является строго обязательным, но в зависимости от того, как закодирован синтаксический анализатор JSON, вам может потребоваться заставить регулярное выражение использовать всю строку. Если вы используете регулярное выражение и для других проверок, вам может понадобиться что-то более сложное, например:
^\w+(?:\.\w+)+$(?<!\.jpg)(?<!\.png)
Вы, вероятно, пытались использовать (?<!\.jpg|\.png)
, что не сработало бы, потому что разновидность регулярных выражений Python является одной из самых строгих, когда дело доходит до просмотра назад. PHP и Ruby 1.9+ приняли бы его, потому что каждый из вариантов имеет фиксированную длину. Они даже не должны быть одинаковой длины; (?<!\.jpg|\.jpeg|\.png)
тоже подойдет. Только не пытайтесь исключить точку, как в (?<!\.(?:jpg|jpeg|png))
; чередование должно быть на верхнем уровне ретроспективного просмотра.
Java примет версию с учетом фактора, потому что она выполняет немного больше работы во время компиляции, чтобы определить максимальное количество символов, которое может потребоваться для просмотра назад. Однако выражение просмотра назад должно быть довольно простым, и оно не может использовать квантификаторы +
или *
. Наконец, варианты .NET и JGSoft не накладывают никаких ограничений на просмотр назад. Но Python делает очень простодушную попытку вычислить точное количество символов, которое должно соответствовать ретроспективному анализатору, генерируя загадочное сообщение об ошибке в случае сбоя.
person
Alan Moore
schedule
07.04.2012