Из вашей формулировки неясно, хотите ли вы соответствовать строке, заканчивающейся на .com
И НЕ содержащей abc
до этого; или чтобы соответствовать строке, которая не имеет «abc, сопровождаемый символами, сопровождаемыми .com».
Это означает, что в первом случае "def.edu"
НЕ совпадает (без «abc», но не заканчивается на «.com»), но во втором случае "def.edu"
соответствует (потому что это не «abcSOMETHING.com» )
В первом случае вам нужно использовать отрицательный взгляд :
(?<!abc.+)\.com$
# Use .* instead of .+ if you want "abc.com" to fail as well
ВАЖНО : ваше исходное выражение с использованием оглядки назад - # 3 ((?<!abc).*\.com
) - не сработало , потому что оглядка назад ТОЛЬКО смотрит назад немедленно предшествующий следующему сроку. Следовательно, «что-то после abc» должно быть включено в поиск вместе с abc
- как это делает мой RegEx выше.
ПРОБЛЕМА : мой RegEx выше вероятного не будет работать с вашим конкретным механизмом RegEx, если он не поддерживает общие запросы с выражением переменной длины (например, тот, что выше) - что ТОЛЬКО .NET
делает в наши дни (хорошее резюме того, что делает и не поддерживает то, что ищет в прошлом, в http://www.regular -expressions.info / lookaround.html ).
Если это действительно так, вам придется выполнить двойное совпадение: сначала проверьте .com
; захватывать все перед этим; тогда отрицательное совпадение на abc. Я буду использовать синтаксис Perl, так как вы не указали язык:
if (/^(.*)\.com$/) {
if ($1 !~ /abc/) {
# Or, you can just use a substring:
# if (index($1, "abc") < 0) {
# PROFIT!
}
}
Во втором случае САМОЕ ПРОСТОЕ, что нужно сделать, это сделать оператор "не соответствует" - например, !~
в Perl (или отрицание результата совпадения, если ваш язык не поддерживает «не совпадает»). Пример использования псевдокода:
if (NOT string.match(/abc.+\.com$/)) ...
Обратите внимание, что вам не нужно использовать ". +" / ". *" При использовании негативного вида сзади;