Регулярное выражение (ruby), чтобы удалить все экземпляры набора символов, КРОМЕ, когда они находятся в начале строки - PullRequest
2 голосов
/ 04 апреля 2019

Я хочу удалить все экземпляры этих символов ["+", "-", "~"] из строки, кроме случаев, когда они встречаются в начале строки.

Например:

"abc"   => "abc"
"ab+c"  => "abc"
"+abc"  => "+abc"
"-+abc" => "-abc"
"ab+-c" => "abc"

Обратите внимание, с четвертым, что + удалено, потому что это был не первый символ.Итак, если в начале строки есть несколько «нежелательных» символов, мы оставляем только первый.

Я не могу понять синтаксис регулярного выражения для этого.Кто-нибудь может помочь?Я использую Ruby, но синтаксис регулярных выражений , как правило, одинаков для разных языков.

1 Ответ

5 голосов
/ 04 апреля 2019

Шаблон ^(![\+\-\~] соответствует началу строки , а затем записывает в группу 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...