Использование регулярных выражений в части «заменить» поиска / замены?

882
Torben Gundtofte-Bruun

У меня есть большое количество текста с отступом (выделено) табуляцией, в котором отсутствует начальный символ маркера:

 some point a sub-point 

Я хочу заменить каждую вкладку на 2 пробела и добавить дефис впереди. Это целевой формат мне нужен:

 - some point - a sub-point 

Найти:
я могу использовать регулярное выражение\t+\S чтобы найти «любое количество вкладок, за которыми следуют любые непробельные символы». Это прекрасно работает, и функция «найти» выделяет начало каждой строки, вплоть до первого символа без табуляции.

Заменить:
Как я могу использовать регулярное выражение, чтобы указать «заменить каждую вкладку двумя пробелами, за которыми следуют один дефис и один пробел, за которым следует оригинальный символ без табуляции»? В частности:

  1. Как указать, что замена должна происходить «столько раз, сколько было совпадений в поиске»? (Таким образом, три вкладки станут шестью пробелами и т. Д.)
  2. Как мне указать литерал «один дефис, затем один пробел»?
  3. Как мне указать «сохранить неизменяемый символ без табуляции»?

Мой гугл-фу привел меня к концепции,\1 но я не понимаю, как я могу это использовать. Мое тестирование методом проб и ошибок приводило только к ошибкам.
Обновление:
Я обнаружил кое -что о \1: Я должен использовать скобки в моей находки строки: (\t+)(\S)и затем использовать его в замене части: \1- \2. Это помогает мне решить пункты № 2 и № 3 выше, но я все еще в растерянности относительно № 1!
Обновление:
Дух - # 1 может быть простым действием поиска / замены без регулярных выражений, если в тексте нет символов табуляции. Это то, что мне нужно исследовать сейчас!

Я пытаюсь с Ubuntu Gedit, но я мог бы также использовать Notepad ++ или Sublime, если у вас есть предложения для конкретного редактора.

2
Я вижу, вы сделали некоторые обновления, пока я отправил свой ответ. Я надеюсь, что вы разобрались. Если так, дайте нам знать. LPChip 6 лет назад 0

2 ответа на вопрос

1
LPChip

Есть два метода, которые вы можете использовать.

Вы можете искать всю строку + что будет дальше, и использовать группировки, чтобы заменить ее одной или несколькими группами, но не всеми. Это где $1или\1 вступает в игру.

Вы также можете искать только ту часть, которую хотите заменить, и просто заменить ее чем-то другим.

Сначала создайте регулярное выражение, которое вы хотите явно заменить, и найдите его. Если ваш поиск ищет несколько частей строки и вы хотите сохранить что-то посередине, то группировка обязательна. Пример: поиск[b]text[/b] и замена его на<b>text</b>

Ваше регулярное выражение будет что-то вроде \[b\](.+)\]\/b\] и заменить его<b>\1</b>

Если вам нужно всего лишь изменить каждое вхождение текста, представляющее собой одну непрерывную строку, вы можете специально выполнить поиск и заменить его. Например, при поиске          -My exampleи замене его на  - My example(который в основном заменяет любые табуляции на два пробела и добавляет пробел после -, вы должны искать \t+-и заменять его на -

Регулярное выражение здесь означает: поиск любой вкладки, которая встречается 1 или более раз, за ​​которой следует перенос. Если вы ищете эту строку без фактической замены, вы увидите, что она выберет текст, который вы хотите заменить.

Если вы хотите заменить любую вкладку двумя пробелами, вам нужно просто найти \tи заменить ее на 

Заметьте, я использовал пробел, за которым следовали alt + 255 везде в этом посте, чтобы набрать 2 пробела подряд, в противном случае SuperUser сжимает все до 1 пробела.

Спасибо за разъяснение использования `\ 1`. В моем случае каждая строка начинается с произвольных слов, поэтому я не могу следовать вашей идее `Мой пример`. Torben Gundtofte-Bruun 6 лет назад 0
Да, ты можешь. Эти слова просто пропускаются при поиске. LPChip 6 лет назад 0
1
Toto

Вы можете сделать это с помощью Notepad ++ в два этапа:

Первый шаг:

  • Ctrl+H
  • Найти то, что: \t
  • Заменить на:    (2 пробела)
  • проверить обернуть
  • проверьте регулярное выражение
  • Replace all

Второй шаг:

  • Найти то, что: ^\h+
  • Заменить: $0-
  • проверить обернуть
  • проверьте регулярное выражение
  • Replace all

Объяснение:

^ : beginning of line \h+ : 1 or more horizontal spaces 

Замена:

$0 : the whole match (ie. all the spaces at the beginning of each line) - : a dash followed by a space 
Мне особенно нравится этот ответ за его акцент на «начале строки», который устраняет мою необходимость обрабатывать первый непробельный символ, а также за его четкое и точное объяснение. Torben Gundtofte-Bruun 6 лет назад 1

Похожие вопросы