Page 28 of 29

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

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

Posted: Sun Nov 22, 2020 1:53 pm
by AZJIO
\].+?\[
заменить на ][

Posted: Sun Nov 22, 2020 4:55 pm
by opk44
FiLinX
Если имеете дело только с такими "вырожденными"* случаями, как представлено в вашем примере, то проще использовать стандартный скрипт "LinesFilter.js"

Image

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

Code: Select all

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

Code: Select all

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

Posted: Sun Nov 22, 2020 9:39 pm
by FiLinX
Неуч подаёт рапорт на выделение внеочередной благодарности участникам AZJIO и opk44 !! )
Оба варианта работают - Спасибо!

Posted: Thu Dec 10, 2020 3:03 pm
by kekos
Находил тут решение для рандомного перемешивания строк. Но, возможно ли реализовать рандомное перемешивание, назову это - "групп строк" (при этом количество самих строк в каждой группе может быть разным)? Есть файл такого вида:

Code: Select all

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

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

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

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Posted: Fri Dec 11, 2020 5:33 pm
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\?|$) – для захвата последней группы.
Весь несоответствующий регулярному выражению текст теряется.
В первом варианте необходимо наличие перевода строки после последней группы.

Posted: Fri Dec 11, 2020 7:44 pm
by kekos
Infocatcher, на форуме не заметил системы репутации, так что напишу в посте - Спасибо! Второй скрипт работает идеально.

Posted: Mon Jun 28, 2021 10:13 am
by pol-zhuk
подскажите, пожалуйста
задача следующая:
"текст Х
текст2 Х текст3 У"
нужно привести к:
"текст Z
текст2 Х текст3 У", где Z - разность Х-У (нецелые числа)

Posted: Fri Jul 02, 2021 4:35 pm
by cellleexx
Здравствуйте!

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

Спасибо!

Image
Image

Posted: Fri Jul 09, 2021 6:48 pm
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]+

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

Posted: Thu Jul 15, 2021 6:23 am
by xzQbCJfH
PadeDown wrote:* - любое количество символов, но программа его понимает буквально.
Вам, в итоге, удалось найти аналог Notepad++-овского .*??

Upd.
Infocatcher wrote:

Code: Select all

[^\r\n]+
?

Posted: Thu Jul 15, 2021 1:48 pm
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 ты мне очень помог! Счастья тебе и удачи и всего наилучшего)!

Posted: Thu Jul 15, 2021 2:39 pm
by cellleexx
Как выделить для замены найденую строку плюс (например) две предыдущие верхние и одну следующую нижнюю?

Спасибо!

Image
Image

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

Code: Select all

(?-s)(^PHOTO;.*|^\s.*)
UPD.: Вообще-то я, скорее всего, не прав. Такой метод можно использовать только если искомый блок идет под удаление. Если же его нужно чем-то заменить, то "фрагментировать" блок на строки нельзя.

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

Code: Select all

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