1

Мне нужна помощь с Find and Replace в Notepad++.

Пример:

$ 250 'Hello 1' Take '____'

$ 500 'Hello 2' Take '____'

$ 1000 'Hello 3' Take '____'

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

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

Я хотел бы, чтобы результат был:

250 долларов США 'Hello 1' Take '250'

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

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

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

3 ответа3

2

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

Поиск:

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

Заменить:

\$$1 $2 Take '$1'

Это будет искать строку, которая в основном выглядит так:

$anything anything Take 'anything'  

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

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

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


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

1

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

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

Объяснение:

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

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

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

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

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

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

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

...

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

\1\2\3

Просто ставим первую и третью скобки, а вторую промежуточную (где вторая скобка - это значение в долларах).

0

Попробуй это

Первый поворот на регулярные выражения

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .