Я хочу удалить текст между двумя строками, используя regular expression в блокнот ++. Вот моя полная строка
[insertedOn]) VALUES (1, N'1F9ACCD2-3B60-49CF-830B-42B4C99F6072',
Я хочу финальную строку вроде этой
[insertedOn]) VALUES (N'1F9ACCD2-3B60-49CF-830B-42B4C99F6072',
Здесь я удалил 1, из строки. 1,2,3 идет в возрастающем порядке.
Я пробовал много выражаться, но не получилось. Вот один из них (VALUES ()(?s)(.*)(, N')
Как я могу это удалить?
Спасибо за ответ. Я попробовал этот (VALUES \().*?,\s*(N'), и он работал :)
Отправил ответ с пояснениями.





Вы должны сначала экранировать буквальный ( перед VALUES: \(
Таким образом, .* в вашем регулярном выражении в дополнение к флагу s (DOTALL) заставляет движок жадно соответствовать до конца входной строки, а затем возвращается к остановке при первом появлении , N', что означает неожиданные совпадения.
Чтобы улучшить ваше регулярное выражение, вы должны 1) сделать .* unngreedy 2) удалить (?s) 3) уйти от (:
(VALUES \().*?, (N')
Чтобы быть более точным в сопоставлении, вам лучше искать:
VALUES \(\K\d+, *(?=N')
и ничего не заменить.
Авария:
VALUES \( Март VALUES ( буквально\K Сбросить совпадение\d+, * Соответствие цифрам перед запятой и необязательными пробелами(?=N'), за которым следует N'Спасибо за ответ :)
Вы можете использовать
(VALUES \().*?,\s*(N')
и замените на $1$2. Обратите внимание: если удаляемая часть строки может содержать разрывы строк, включите . соответствует новой строке. Если N и VALUES должны быть сопоставлены только в ALLCAPS, убедитесь, что опция Учитывать регистр отмечена.
Детали выкройки
(VALUES \() - Группа 1 (позже именуемая $1 из шаблона замены): буквальная подстрока VALUES (.*? - любые символы 0+, как можно меньше, до крайнего левого вхождения последующих подшаблонов,\s* - запятая и 0+ пробелов (используйте \h вместо \s для соответствия только горизонтальным символам пробелов)(N') - Группа 2 (позже именуемая $2 из шаблона замены): буквальная подстрока N'.Относительно второстепенный момент, но вместо использования .*? лучше использовать [^,]*. На самом деле это не имеет значения для этой конкретной строки, но когда у вас есть более длинные строки для сопоставления, использование ленивого квантификатора менее эффективно. При использовании ленивого квантификатора требуется в два раза больше шагов, чем при проверке каждого символа дважды, тогда как при использовании [^,] просто сопоставляется, пока не дойдет до ,.
Еще одна вещь, которая является просто выбором стиля, - в одном случае вы используете `` для пробелов после значений, а в другом вы используете \s. Это не имеет значения, но я бы выбрал один и придерживался его. Я предпочитаю \s для удобства чтения.
@JackPRead Я вижу, я также объяснил, что \h может быть более полезным, чем \s .. [^,]* - спорное усовершенствование, потому что оно предотвратит совпадение, если есть , на пути от VALUE ( к N'.
.*?, и [^,]*, соответствуют одному и тому же, за исключением того, что первый требует вдвое больше шагов. И то, и другое предотвратит совпадение, если по пути окажется ,, как вы сказали. Как я уже сказал выше, для строки такого размера оптимизация незначительна, и для этой строки действительны оба регулярных выражения.
@JackPRead Нет, [^,]* не может соответствовать так же, как .*?здесь, см. мое регулярное выражение против ваш вариант. Они работают одинаково только тогда, когда справа есть один атом (например, a.*?b = a[^b]*b). В сценарии OP правая граница представляет собой последовательность шаблонов, поэтому .*? более подходит.
Попробуйте
(VALUES \().*?,\s*(N')=>$1$2