Эта часть шаблона .*
будет сначала соответствовать до конца строки. Тогда он будет утверждать, что справа не ~D
, что верно, потому что он находится в конце строки, поэтому он будет соответствовать всей строке.
Например, вы можете начать с начала строка ^
и повтор совпадения всех символов, за которыми не следует ~D
^(?:.(?!~D))*
^
начало строки (?:
группа без захвата .(?!~D)
Подберите любой символ, кроме новой строки, и подтвердите, что прямо справа не является ~D
)*
Закройте группу и повторите 0 или более раз
См. Демонстрационную версию Regex
Если вы хотите учесть границы пробелов вместо ^
и сопоставить, например, только непробельные символы:
(?<!\S)(?:\S(?!~D))*
Regex demo