Регулярные выражения

Russian main discussion
  • Author
  • Message
Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

YuS
приношу извинения, забыл отписаться, постоянно вспоминал, но что-то не давало возможности...

спасибо, нужную работу совершило

правда пришлось кой-что поправить и сделать немного по другому

изначально как было, так и я не смог сделать - двузначные и одиночные цифры обрабатывало не так как трехзначные, пришлось несколькими регулярками после обработать, и всё сделалось как мне и нужно было...

спасибо

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

InFive wrote: правда пришлось кой-что поправить и сделать немного по другому

изначально как было, так и я не смог сделать - двузначные и одиночные цифры обрабатывало не так как трехзначные, пришлось несколькими регулярками после обработать, и всё сделалось как мне и нужно было...
Так ведь, как корабль назовешь, так он и поплывет... в смысле, как условие было составлено, так код и работает :)
а для
\d+
- абсолютно без разницы, одно-, двух-, трех- или многозначное число, главное в той части - разделители. В условии задачи, это были запятые... ну и набор символов " ZZZ ", от них всё и зависит.

ЗЫ
Перепроверил...
А-а-а, вот почему оно не "стреляло".
Изначально вот в этом месте:

Code: Select all

c[b].replace(/((\d+).\d+)/g,"$1 $2")
было так:

Code: Select all

c[b].replace(/((\d+)—\d+)/g,"$1 $2")
потом почему-то подумалось, что разделителем цифр может быть не только "—" и на "скорую руку" заменил на ".", но не проверил, сорри :)
В общем, замените всё так, как было изначально и получите то, что требовалось.

ЗЫЫ
В исходном сообщении исправил, вдруг кому ещё пригодится...
Last edited by YuS on Mon May 28, 2018 2:46 pm, edited 1 time in total.

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

YuS
спасибо за эту функцию, уже дала не один бой...

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

прошу прощения, но это опять я...

нужна помощь - помогите составить функцию, чтобы заменялось генератором случайных значений в hex-диапазоне, чтобы

ZZZZZ

заменялось на случайные значения в виде

397790f1-afc8-4524-810a-c0f8f11c38da

первая группа - 8 символов
вторая по четвертую - по 4 символа
пятая группа - 12 символов

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

InFive wrote: нужна помощь - помогите составить функцию, чтобы заменялось генератором случайных значений в hex-диапазоне, чтобы

ZZZZZ

заменялось на случайные значения в виде

397790f1-afc8-4524-810a-c0f8f11c38da

первая группа - 8 символов
вторая по четвертую - по 4 символа
пятая группа - 12 символов
Т.е. нужен генератор GUID... надо было так и написать :)
генерируем четверки и складываем их в требующуюся строку:
SearchReplace.js
[v] Регулярные выражения
[v] Многострочно
[v] Заменять на функцию

Code: Select all

Что: ZZZZZ
Чем: function guid(){function t(){return Math.floor((1+Math.random())*0x10000).toString(16).substring(1);}return t()+t()+'-'+t()+'-'+t()+'-'+t()+'-'+t()+t()+t();} return guid();

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

YuS
спасибо, я попробую, когда закончу документ, сейчас попробовать не могу, у меня Linux...

потом буду делать замены на другом компе...

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

YuS wrote:
InFive wrote: мне нужно пометить строки, в которых третья цифра изменена по сравнению с третьей цифрой из предыдущей строки
Вот так, гораздо точнее...

TextReplace.js

[v] Регулярные выражения
[v] Заменять на функцию

Code: Select all

Что:^'\d+',\s'\d+',\s'(\d+)[^\n]*
Чем:if (typeof(n) == "undefined" || n == parseInt(_s1)) {n=parseInt(_s1);return _s0} else {n=parseInt(_s1);return _s0+"====="}
Замену осуществлять один раз: "Заменить всё", после чего, при необходимости повторной замены, либо в другой вкладке, необходимо закрыть окно скрипта и открыть вновь - для удаления временной переменной.
В принципе, ничего страшного, если не закрывать, но тогда в самой первой совпавшей с шаблоном строке, придется снимать пометку вручную.
думал, уже сегодня буду генерировать GUID с помощью функции, которую здесь помогли составить, но не тут та было - превращая обычный текстовый документ в json сложной структуры, все таки не все смог продумать, начинать редактировать сначала не вариант из-за долгой и кропотливой работы, хотя и делать промежуточные бекапы...

одна надежда на вас - почему данную функцию не могу использовать для отлова совпадают/не совпадают слова?

например,

T3T3T3ZZZZZохрана 512 QQQF4
T3T3T3ZZZZZохрана 513 QQQF4
T3T3T3ZZZZZохрана 630-632 QQQF4
T4T4T4ZZZZZзащита 240 QQQF5
T4T4T4ZZZZZзащита 272 QQQF5
T3T3T3ZZZZZпомощь 139 QQQF4
T3T3T3ZZZZZпомощь 140 QQQF4
T3T3T3ZZZZZпомощь 360 QQQF4

использую

T\dT\dT\dZZZZZ(.+)\t\t\t
на
if (typeof(n) == "undefined" || n == parseInt(_s1)) {n=parseInt(_s1);return _s0} else {n=parseInt(_s1);return "=====" + _s0}

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

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

InFive wrote:почему данную функцию не могу использовать для отлова совпадают/не совпадают слова?
Потому, что функция составлена не для этого действия. Кроме того, регэксп составлен неверно...

Offline
Posts: 96
Joined: Tue Nov 10, 2015 4:56 am

Post by InFive »

YuS
я неоднократно использовал эту функцию для отлова изменения цифр в разных исходных комбинациях, но вот изменить ее для отлова изменения в словах у меня не хватает знаний...

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

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

InFive wrote:YuS
я неоднократно использовал эту функцию для отлова изменения цифр в разных исходных комбинациях, но вот изменить ее для отлова изменения в словах у меня не хватает знаний...
В этой функции используется метод конвертации строки в число, поэтому слов там не будет...
InFive wrote: помогите, пожалуйста, составить фонкцию для отлова изменений слов, закончить не могу документ в 57 тысяч строк из-за непредвиденной проблемы
Здесь требуются уточнения по условиям... т.е. что именно требуется найти и пример массива строк в котором содержится то, что требуется найти, а также содержатся строки, где нет искомого набора символов.

Offline
Posts: 5
Joined: Wed Oct 31, 2018 8:05 am

не работает шаблон поиска

Post by konstazhoglo »

hi all,
есть текстовый файл в котором содержится текст на английском и русском языках, количество строк примерно 14000, строки отсортированны и многие повторяются. Задача удалить все дубликаты.
нашел шаблон регулярного выражения для решения этой задачи, который на ура справляется с этой задачей в notepad++
^(.*?)$\s+?^(?=.*^\1$)
Но при запуске его в akelpad прога виснет наглухо, остановить операцию поиска и замены невозможно, приходится принудительно завершать работу программы.
В чем грабли? Почему в notepad++ операция занимает буквально секунды, а в akelpad этот шаблон не работает, хотя согласно описанию akelpad поддерживает регулярные выражения при поиске и замене текста?
Last edited by konstazhoglo on Thu Nov 01, 2018 1:14 pm, edited 1 time in total.

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

Re: не работает шаблон поиска

Post by opk44 »

konstazhoglo wrote:hi all,
есть текстовый файл в котором содержится текст на английском и русском языках, количество строк примерно 14000, строки отсортированны и многие повторяются. Задача удалить все дубликаты.
нашел шаблон регулярного выражения для решения этой задачи, который на ура справляется с этой задачей в notepad++
^(.*?)$^(?=.*^\1$)
Но при запуске его в akelpad прога виснет наглухо, остановить операцию поиска и замены невозможно, приходится принудительно завершать работу программы.
В чем грабли? Почему в notepad++ операция занимает буквально секунды, а в akelpad этот шаблон не работает, хотя согласно описанию akelpad поддерживает регулярные выражения при поиске и замене текста?
1. Тот шаблон, что вы тут написали, он и в notepad++ не работает.
Вероятно при переписывании допущена ошибка.
Если хотели убрать ТОЛЬКО ТЕКСТ в повторяющихся строках, то можно оставить так:

Code: Select all

^(.*?)$(?=.*^\1$)
но тогда при большом количестве повторов в тексте остаётся много "дыр" (пустых строк на месте очищенных).
Чтобы убирать повторяющиеся строки ЦЕЛИКОМ, шаблон придётся "нарастить":

Code: Select all

^(.*?)$\s+?^(?=.*^\1$)
2. Для поиска и удаления дубликатов строк в AkelPad есть более простой инструмент, чем регэкспы. Используйте Format-плагин:

Code: Select all

Format::LineRemoveDuplicates

Offline
Posts: 5
Joined: Wed Oct 31, 2018 8:05 am

Post by konstazhoglo »

спасибо за совет.

Да я ошибся при вставке шаблона, вставил не тот.
Работает вот этот шаблон ^(.*?)$\s+?^(?=.*^\1$) в notepad++

Вопрос остается открытым почему эта строка поиска не работает в akelpad? Ограничений на нее нет и в руководстве указано, что редактор поддерживает рекэкспы.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

konstazhoglo wrote:спасибо за совет.

Да я ошибся при вставке шаблона, вставил не тот.
Работает вот этот шаблон ^(.*?)$\s+?^(?=.*^\1$) в notepad++

Вопрос остается открытым почему эта строка поиска не работает в akelpad? Ограничений на нее нет и в руководстве указано, что редактор поддерживает рекэкспы.
А ответы Вы читаете полностью?
Найдите 10 отличий:

Code: Select all

1. ^(.*?)$\s+?^(?=.*^\1$)
2. ^(.*?)$\s+?^(?=.*^\1$)
Первый шаблон напечатан Ср Окт 31, 2018 6:08 pm в ответе opk44, адресованном Вам. И он таки работает.
Второй - напечатали Вы Чт Ноя 01, 2018 6:34 pm, с указанием того, что он якобы не работает.
Где логика?

Как бы подсказка:

Code: Select all

(?-s)^(.*?)$\s+?^(?=.*^\1$)

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

Post by opk44 »

YuS,
Мне кажется, что данная поправка менее универсальна (будет работать только с отсортированным списком).
Поэтому наоборот, вместо (?-s) использовал бы (?s). В предыдущем ответе не использовал ни того ни другого, как минимум, по двум причинам:
1. Т.к. у меня по дефолту выставлена опция регулярных выражений [точка захватывает \n].
2. Исходя из того, что согласно первоначальным условиям список уже отсортирован, то данная опция в любом варианте избыточна.
Post Reply