Шаблон ^(![\+\-\~]
соответствует началу строки , а затем записывает в группу 1 символ !
, за которым следуют символы +
, -
или ~
, поэтому вы удаляете только !+
, !~
или !-
в начале строки.
Вы можете использовать
/(?!\A)[+~-]/
Соответствует любому +
, ~
или -
char ([+~-]
), которые не находятся в начале строки ((?!\A)
). (?!\A)
- это отрицательный прогноз, который не соответствует совпадению, если его шаблон не сопоставлен сразу же справа от текущего местоположения. Если местоположение находится в начале строки (\A
активирует именно эту позицию), совпадение не выполняется. Поскольку \A
является якорем, который не потребляет никакого текста, так называемый шаблон нулевой длины, нет разницы, если вы используете упреждающий просмотр или просмотр назад, (?<!\A)
.
Убедитесь, что -
находится либо в начале, либо в конце класса персонажа, и вам не придется его избегать.
Демонстрация Ruby :
strs = ["abc", "ab+c", "+abc", "-+abc", "ab+-c"]
strs.each { |x| p x.gsub(/(?!\A)[-+~]/, "") }
Выход:
"abc"
"abc"
"+abc"
"-abc"
"abc"