Захватывать

Захватывать

Мне нужна помощь с функцией «Найти и заменить» в Notepad++.

Пример:

250 долларов «Привет 1» Возьми «____»

500 долларов «Привет 2» Возьми «____»

1000 долларов «Привет 3» Возьми «____»

Представьте себе, что таких записей тысячи, вплоть до «Привет, 9999».

Я хочу заменить «____» на число, не меняя «Hello 1» или «Hello 2».

Я хотел бы, чтобы результат был следующим:

$250 «Привет 1» Возьми «250»

$500 «Привет 2» Возьми «500»

$1000 «Привет 3» Возьми «1000»

Как мне это сделать? Я бы ожидал использовать регулярное выражение.

решение1

Отметьте флажок регулярного выражения и используйте:

Поиск:

\$(.*?) (.*?) Take '(.*?)'

Заменять:

\$$1 $2 Take '$1'

Будет выполнен поиск строки, которая выглядит примерно так:

$anything anything Take 'anything'  

.*? означает любой символ, кроме новой строки в регулярных выражениях.
Заключение в скобки группы захвата, такой как .*?, сохранит ее содержимое в переменной $n, где n — n-я группа.

Итак, после поиска у нас будет три переменные:
$1 = 250 $2 = 'Привет 1' $3 = ___

С помощью замены мы заменяем всю строку на \$ (экранирование знака доллара делает ее буквально $, а не переменной).
Вся строка заменяется на $$1 $2 '$1'
Как видите, мы снова используем переменную $1, которая является первой захватывающей группой.


Я новичок на SO, так что извините, если мои объяснения не очень хороши.

решение2

Это должен быть синтаксис Notepad++, при этом необходимо выбрать переключатель «Регулярное выражение» в нижней части диалогового окна «Найти/Заменить»:

Find:  (\$(\d+).*Take\s+').*(')
Replace:  \1\2\3

Объяснение:

Скобки группируют переменные в порядке, считая слева направо:

(\$(\d+).*Take\s+').*(')
|--------1--------|
   |-2-|             |3|

\$ : означает найти знак доллара

\d+ : означает поиск цифр, «+» в конце означает одну или несколько (т.е. ДОЛЖНА быть как минимум одна цифра).

.* : "." означает ЛЮБОЙ символ, а "*" означает один или несколько.

Возьмите: это просто конкретно слово Текст.

\s+ : означает пробел, а «+» означает один или несколько.

...

Теперь, поскольку все сгруппировано, КРОМЕ последних символов в одинарных кавычках, то:

\1\2\3

Просто помещает первую и третью скобки, а вторые между ними (где вторые скобки — это стоимость в долларах).

решение3

Попробуй это

Сначала включите регулярные выражения

Настройки Notepad++ для включения регулярных выражений

https://regex101.com/r/aW4gG2/2

Найти: (\$\d+)(.*Take ')(.*)(')
Заменить:\1\2\1\4

Захватывать

В этом выражении есть четыре группы

Вход:$250 'Hello 1' Take '____'

Группа 1
(\$d+)= $250- здесь говорится, что нужно начать с $ (экранированного для литерала), затем идут цифры ( \d) 1 или более, так что он останавливается на последней цифре, будь то 3 или 15. В вашем примере они были в начале строки, но я этого не предполагаю. Однако если они ДЕЙСТВИТЕЛЬНО начинают строку, то вы можете добавить, что ^делает ее^(\Sd+)

Группа 2
(.*Take ')= 'Hello 1' Take '- выражение говорит .*, что означает любой символ любое количество раз, поэтому оно берет все, пока не увидит Take, а затем берет, Take 'потому что я это написал, и останавливается на этом.

Группа 3
(.*)= - ____это занимает внутреннее пространство, в основном это занимает что угодно 0 или более раз. В этом случае это все подчеркивания, но написано, что это захватит все и все, что у вас есть там. Это захватит все до конца строк, за исключением того, что у меня есть что-то после этого, что говорит ему, когда остановиться

Группа 4
(')= - 'это говорит группе 3 остановиться на 'отметке. Она также захватывает 'отметку в своей собственной группе для перегруппировки.

Замена

\1\2\1\4

Группы нумеруются по их открытым скобкам, но в этом случае все линейно, без вложенности, так что это довольно очевидно. \1\2\3\4оставил бы все как есть. Но мы хотим заменить третью группу первой группой, так что.... \1\2\1\4сработает. Одним из ключевых моментов здесь было убедиться, что мы захватили эту четвертую группу, чтобы заменить ее в конце. Дальше ничего слишком сложного.

Исполнение

Так что просто настройте это в меню «Найти и заменить», а затем нажмите «Заменить все», и это должно исправить ситуацию.

Редактировать

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

Вход:$250 'Hello 1' Take '____'

Найти: (\$)(\d+)(.*Take ')(.*)(')
Заменить:\1\2\3\2\5

Связанный контент