[^(?!(\d+\.\d+))]
- это класс символов . Класс символов соответствует ровно одному символу из набора символов, который вы описываете в квадратных скобках. Ваш эквивалент этому:
[^!()+.\d]
^
в начале инвертирует набор, а \d
соответствует цифре так же, как и вне класса символов, но остальные символы буквально совпадают. Другими словами, вы указываете, что он соответствует любому одному символу, который не !
, (
, )
, +
, .
или цифре.
Похоже, вы пытались использовать негативную перспективу, которая является правильным подходом. Если вам важна только сумма в долларах в конце строки, вы можете сделать это:
^(?!.*\d+\.\d+$).*$
Lookahead пытается соответствовать \d+\.\d+
в конце строки. Если это удастся, общее совпадение не удастся. В противном случае .*$
занимает всю строку, поэтому вы можете получить ее с помощью метода group()
Matcher.
Предполагается, что вы применяете регулярное выражение к одной строке за раз. Если вы пытаетесь найти совпадающие строки в большем тексте, вы должны указать режим MULTILINE, который вы можете сделать так:
(?m)^(?!.*\d+\.\d+$).*$