То, что вы пытаетесь достичь, довольно сложно с помощью регулярных выражений, поскольку нет способа выразить «заменить строки, не соответствующие шаблону». Вам нужно будет использовать «положительный» шаблон, сообщающий, что сопоставлять, а не что не сопоставлять.
Кроме того, вы хотите заменить каждого символа на заменяющий символ, поэтому вы должны убедиться, что ваш шаблон соответствует ровно одному символу. В противном случае вы замените целые строки одним символом, возвращая более короткую строку.
Для вашего игрушечного примера, вы можете использовать отрицательные взгляды и взгляды, чтобы выполнить задачу, но это может быть более трудным для реальных примеров с более длинными или более сложными строками, так как вам придется рассматривать каждый символ вашей строки отдельно вместе с его контекстом.
Вот шаблон для «not‘ abc ’»:
[^abc]|a(?!bc)|(?<!a)b|b(?!c)|(?<!ab)c
Он состоит из пяти подэлементов, связанных с «или» (|
), каждый из которых соответствует ровно одному символу:
[^abc]
соответствует каждому символу, кроме a
, b
или c
a(?!bc)
соответствует a
, если за ним не следует bc
(?<!a)b
соответствует b
, если ему не предшествует a
b(?!c)
соответствует b
, если за ним не следует c
(?<!ab)c
соответствует c
, если ему не предшествует ab
Идея состоит в том, чтобы сопоставить каждый символ, который не входит в целевое слово abc
, плюс каждый символ слова, который, согласно контексту, не является частью вашего слова. Контекст может быть исследован с использованием негативных просмотров: (?!...)
и взглядов (?<!...)
.
.
Вы можете себе представить, что эта техника не удастся, если у вас есть целевое слово, содержащее один символ более одного раза, например example
. Довольно сложно выразить «соответствует e
, если за ним не следуют x
и , за которыми не следует l
».
Особенно для динамических паттернов гораздо проще выполнить положительный поиск, а затем заменить каждый символ, который не совпадает во втором проходе, как другие предложили здесь.