поиск и замена

Russian main discussion
  • Author
  • Message
Offline
Posts: 12
Joined: Fri Oct 24, 2008 4:05 am
Location: где то рядом была Москва

Post by FiLinX »

Ребята, помогите неучу)
Как в большом тхт файле удалить всё, кроме строк в квадратных скобках? Сами скобки можно и не удалять.
Простейшее вроде)
Например:
[Blob Storage *]
LangSecRef=3029
Detect1=HKCU\Software\7Star\7Star
Detect2=HKCU\Software\360Browser\Browser
...и тд..

вот нужно оставить только [Blob Storage *] и последующие такие же

Offline
Posts: 348
Joined: Mon Jun 03, 2019 2:33 am

Post by AZJIO »

\].+?\[
заменить на ][

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

FiLinX
Если имеете дело только с такими "вырожденными"* случаями, как представлено в вашем примере, то проще использовать стандартный скрипт "LinesFilter.js"

Image

* под "невырожденными" здесь подразумеваю:
1) строки внутри строк

Code: Select all

убрать--убрать--[оставить-оставить-оставить]-убрать--убрать.
2) многострочные блоки

Code: Select all

[-оставить-1
-оставить-2
...
-оставить-n]
3) совмещение первых двух.

Offline
Posts: 12
Joined: Fri Oct 24, 2008 4:05 am
Location: где то рядом была Москва

Post by FiLinX »

Неуч подаёт рапорт на выделение внеочередной благодарности участникам AZJIO и opk44 !! )
Оба варианта работают - Спасибо!

Offline
Posts: 2
Joined: Thu Dec 10, 2020 2:10 pm

Post by kekos »

Находил тут решение для рандомного перемешивания строк. Но, возможно ли реализовать рандомное перемешивание, назову это - "групп строк" (при этом количество самих строк в каждой группе может быть разным)? Есть файл такого вида:

Code: Select all

?1
Текст
+ Текст
- Текст
- Текст
- Текст

?2
Текст
- Текст
- Текст

?3
Текст
- Текст
- Текст
+ Текст
- Текст
- Текст

И т.д.
Соответственно, "группа строк 1":

Code: Select all

?1
Текст
+ Текст
- Текст
- Текст
- Текст
"Группа строк 2"

Code: Select all

?2
Текст
- Текст
- Текст
И т.д. Ищется каждая из таких "групп строк" регулярным выражением:

Code: Select all

(\?.(.|\n)*?)(?=\n\?)

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

kekos

Примерно так:

Code: Select all

var text = AkelPad.GetTextRange(0, -1, 2 /*\n*/);
var groups = text.match(/(\?.(.|\n)*?)(?=\n\?|$)/g);
shuffle(groups);

AkelPad.SetSel(0, -1);
AkelPad.ReplaceSel(text);

function shuffle(arr) {
	var i = arr.length;
	while(--i) {
		var rnd = Math.floor(Math.random()*(i + 1));
		var tmp = arr[i];
		arr[i] = arr[rnd];
		arr[rnd] = tmp;
	}
}


Чуть больше удобств:

Code: Select all

var text = AkelPad.GetTextRange(0, -1, 2 /*\n*/);

var addLF = !/\n$/.test(text);
if(addLF)
	text += "\n";

var groups = text.match(/(\?.(.|\n)*?)(?=\n\?|$)/g);

shuffle(groups);

var out = groups.join("\n");
if(addLF)
	out = out.slice(0, -1);

replaceText(out);

function shuffle(arr) {
	var i = arr.length;
	while(--i) {
		var rnd = Math.floor(Math.random()*(i + 1));
		var tmp = arr[i];
		arr[i] = arr[rnd];
		arr[rnd] = tmp;
	}
}
function replaceText(text) {
	var oSys = AkelPad.SystemFunction();
	var hWndEdit = AkelPad.GetEditWnd();

	setRedraw(hWndEdit, false);
	AkelPad.SetSel(0, -1);
	AkelPad.ReplaceSel(text);
	setRedraw(hWndEdit, true);

	function setRedraw(hWnd, bRedraw) {
		AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
		bRedraw && oSys.Call("user32::InvalidateRect", hWnd, 0, true);
	}
}


(?=\n\?|$) – для захвата последней группы.
Весь несоответствующий регулярному выражению текст теряется.
В первом варианте необходимо наличие перевода строки после последней группы.

Offline
Posts: 2
Joined: Thu Dec 10, 2020 2:10 pm

Post by kekos »

Infocatcher, на форуме не заметил системы репутации, так что напишу в посте - Спасибо! Второй скрипт работает идеально.

Offline
Posts: 4
Joined: Thu Nov 05, 2015 8:05 am

Post by pol-zhuk »

подскажите, пожалуйста
задача следующая:
"текст Х
текст2 Х текст3 У"
нужно привести к:
"текст Z
текст2 Х текст3 У", где Z - разность Х-У (нецелые числа)

Offline
Posts: 8
Joined: Fri Jul 02, 2021 4:32 pm

Post by cellleexx »

Здравствуйте!

Подскажите, пожалуйста, регулярку чтобы найти и заменить фрагмент текста, который выделен на картинке

Спасибо!

Image
Image

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

cellleexx
Не совсем понятно, форматируется ли base64-строка принудительными переводами строк, но можно попробовать вот так:

Code: Select all

^PHOTO;ENCODING=BASE64;\w+:[\da-zA-Z/\+\s]+=*(?=[\r\n]+[A-Z]+[:;])
Если переводов строк нет, можно урезать до

Code: Select all

^PHOTO;[^\r\n]+

Offline
Posts: 3
Joined: Tue Jan 31, 2017 5:32 pm

Re: Поиск и замена: справочная информация

Post by xzQbCJfH »

PadeDown wrote:* - любое количество символов, но программа его понимает буквально.
Вам, в итоге, удалось найти аналог Notepad++-овского .*??

Upd.
Infocatcher wrote:

Code: Select all

[^\r\n]+
?

Offline
Posts: 8
Joined: Fri Jul 02, 2021 4:32 pm

Post by cellleexx »

Infocatcher wrote:cellleexx
Не совсем понятно, форматируется ли base64-строка принудительными переводами строк, но можно попробовать вот так:

Code: Select all

^PHOTO;ENCODING=BASE64;\w+:[\da-zA-Z/\+\s]+=*(?=[\r\n]+[A-Z]+[:;])
Если переводов строк нет, можно урезать до

Code: Select all

^PHOTO;[^\r\n]+
Вот в том и дело, что там переводы строк, я не знал как сделать. Такую строку в поле поиска я не осилил. Первый вариант сработал!
Спасибо тебе тебе добрый человек, Infocatcher ты мне очень помог! Счастья тебе и удачи и всего наилучшего)!

Offline
Posts: 8
Joined: Fri Jul 02, 2021 4:32 pm

Post by cellleexx »

Как выделить для замены найденую строку плюс (например) две предыдущие верхние и одну следующую нижнюю?

Спасибо!

Image
Image

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

cellleexx
1. Ну так-то было бы нелишним приводить тестовые примеры в виде текста, а не изображения. Это бы упростило жизнь отвечающим (меньше предположений строить).
2. Если, как оказалось, "там переводы строк", то можно (теперь) предположить, что все "лишние" строки (кроме первой) начинаются с пробела.
Если это так, тогда ещё можно использовать "вилку" из двух регулярных выражений: 1) искать строку, начинающуюся с "PHOTO;" 2) искать строку, начинающуюся с пробела:

Code: Select all

(?-s)(^PHOTO;.*|^\s.*)
UPD.: Вообще-то я, скорее всего, не прав. Такой метод можно использовать только если искомый блок идет под удаление. Если же его нужно чем-то заменить, то "фрагментировать" блок на строки нельзя.
Last edited by opk44 on Thu Jul 15, 2021 3:12 pm, edited 1 time in total.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

cellleexx wrote:Как выделить для замены найденую строку плюс (например) две предыдущие верхние и одну следующую...
Красивого решения в голову не приходит, но можно попробовать искать "механически": "X строка"+"X строка"+"Y строка"+"X строка"

Code: Select all

^.*$\n^.*$\n(FN:c)\n^.*$\n
Post Reply