Page 28 of 28

Posted: Thu Jan 28, 2016 12:16 am
by YuS
Stranger wrote:Подскажите, как в строке замены в скрипте с использованием AkelPad.TextReplace отделить обратную ссылку (\\1) от цифр последующего текста
Заменить символ цифры кодом. Пример

Добавлено:
упс, пока отвлекся, уже ответили... но пусть тоже будет.

Posted: Thu Jan 28, 2016 5:57 pm
by Stranger
Благодарю всех за ответы!
Впрочем, для моей задачи все равно придется воспользоваться каким-то другим инструментом, т.к. выяснилось, что мой скрипт работает неприлично долго (

Posted: Thu Jan 28, 2016 7:55 pm
by FeyFre
Stranger, sed?

Posted: Fri Jan 29, 2016 7:02 am
by Stranger
FeyFre
Нет, помощь друга с использованием node.js ))

Posted: Sun Feb 21, 2016 3:14 pm
by Instructor
YuS wrote:- при пошаговой замене, вхождение находит, но не заменяет.
- при нажатии "Заменить всё", отрабатывает нормально.
AkelHelp-Rus.htm wrote:- Если метасимвол \K исключил символы из результата, кнопка "Заменить" в диалоге замены будет работать как "Найти".

Posted: Mon Feb 22, 2016 7:10 am
by YuS
Instructor wrote:
AkelHelp-Rus.htm wrote:- Если метасимвол \K исключил символы из результата, кнопка "Заменить" в диалоге замены будет работать как "Найти".
А-а-а, вот почему оно не "стреляло"!
Спасибо, за подсказку...
Документацию, действительно, надо освежать в памяти периодически, а то забывается со временем... :)

Posted: Thu Apr 28, 2016 7:29 am
by alexfk
LonerD wrote:Можно ли одной операцией заменить несколько идущих подряд табуляторов на один табулятор И несколько идущих подряд пробелов на один пробел? Или это операция в два шага?
KDJ wrote:Replace dialog, RegExp:
What: (\t| )\1+
With: \1
А почему не работает такой вариант???
What: (\s){2,}
With: \1

Posted: Thu Apr 28, 2016 2:30 pm
by YuS
del (поэкспериментировал и оказалось, что рассуждения не соответствуют действительности.)

Просто шаблон с группой должен быть фиксированной длины, для корректной работы обратной ссылки в поле "Чем:". Т.е. таким:

Code: Select all

Что: (\s)\1++
Чем: \1

Posted: Sat May 21, 2016 5:23 pm
by ewild
Есть бекап телефонной книги Андроид с многими сотнями контактов в формате .vcf.
Каждый отдельный контакт находится в пределах своей карточки со структурой
BEGIN:VCARD
...
TEL;CELL;...
...
END:VCARD

Code: Select all

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8:Фамилия1;Имя1;;;
FN;CHARSET=UTF-8:Имя1 Фамилия1
TEL;CELL;X-SYNCMLREF19667:+111111111111
BDAY:11111111
X-ACCOUNT:com.sonyericsson.localcontacts;Phone contacts
PHOTO;ENCODING=BASE64;TYPE=JPEG:
X-IRMC-LUID:000000001E1C
END:VCARD

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8:Фамилия2;Имя2;;;
FN;CHARSET=UTF-8:Имя2 Фамилия2
TEL;CELL;X-SYNCMLREF19677:+222222111111
X-ACCOUNT:com.sonyericsson.localcontacts;Phone contacts
X-IRMC-LUID:000000001E20
TEL;CELL;X-SYNCMLREF19677:+222222222222
END:VCARD

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8:Фамилия3;Имя3;;;
FN;CHARSET=UTF-8:Имя3 Фамилия3
TEL;CELL;X-SYNCMLREF19717:+333333111111
TEL;CELL;X-SYNCMLREF19718:+333333222222
TEL;WORK;X-SYNCMLREF19719:+333333333333
X-ACCOUNT:com.sonyericsson.localcontacts;Phone contacts
X-IRMC-LUID:000000001E2C
END:VCARD

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8:Фамилия4;Имя4;;;
FN;CHARSET=UTF-8:Имя4 Фамилия4
TEL;WORK;X-SYNCMLREF19734:+444444333333
TEL;CELL;X-SYNCMLREF19735:+444444111111
TEL;CELL;X-SYNCMLREF19736:+444444222222
EMAIL;PREF;X-SYNCMLREF19737:444@444.net
X-ANNIVERSARY:44441111
X-ACCOUNT:com.sonyericsson.localcontacts;Phone contacts
X-IRMC-LUID:000000001E31
END:VCARD

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8:Фамилия5;Имя5;;;
FN;CHARSET=UTF-8:Имя5 Фамилия5
TEL;CELL;X-SYNCMLREF131010:+555555111111
TEL;CELL;X-SYNCMLREF131011:+555555222222
TEL;CELL;WORK;X-SYNCMLREF131012:+555555333333
NOTE;ENCODING=QUOTED-PRINTABLE:Info
X-ACCOUNT:com.sonyericsson.localcontacts;Phone contacts
X-IRMC-LUID:00000000208C
END:VCARD

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8:Фамилия7;Имя7;;;
FN;CHARSET=UTF-8:Имя7 Фамилия7
TEL;HOME;X-SYNCMLREF1:+777777444444
TEL;WORK;X-SYNCMLREF1:+777777555555
TEL;CELL;X-SYNCMLREF1:+777777111111
TEL;CELL;WORK;X-SYNCMLREF1:+777777333333
TEL;FAX;WORK;X-SYNCMLREF1:+777777666666
TEL;CELL;X-SYNCMLREF1:+777777222222
TEL;X-SYNCMLREF1:+777777777777
EMAIL;INTERNET;PREF:777@14.com
EMAIL;INTERNET:777@15.com
EMAIL;INTERNET:777@16.com
URL;WORK:17
ADR;HOME;X-SYNCMLREF1:;;77708;77710;77711;77709;77712
ADR;WORK;X-SYNCMLREF1:;;77718;77720;77721;19;77722
ORG:77713
BDAY:77777777
END:VCARD


Задача: Для того чтобы базу экспортировать в старый телефон без потерь необходимо внести небольшое изменение. А именно: найти в базе андроид карточки, где есть два входа TEL;CELL;X и переименовать второй из них.

Чтобы такие карточки исходной базы Андроид:
BEGIN:VCARD
...
TEL;CELL;X...
TEL;CELL;X...
...
END:VCARD
Приняли вид:
BEGIN:VCARD
...
TEL;CELL;X...
TEL;CELL;RENAMED;X...
...
END:VCARD
Пытаюсь сделать это с применением регулярных выражений. Но, к сожалению, не силен в этом.

Исходная идея:
Выделить каждый отдельный фрагмент:
BEGIN:VCARD ... END:VCARD
А внутри него найти пару TEL;CELL;X и из них взять вторую.

Не получается. Много уже прочитал, поэкспериментировал, но лучшее, чего удалось добиться это вот:

Найти:

Code: Select all

(?msiU)(?:BEGIN:VCARD.*(?:TEL;CELL;X)+.*)\K(TEL;CELL;X)(?=.*END:VCARD)
Заменить на:

Code: Select all

TEL;CELL;RENAMED;X
Работало бы (работает), если бы все карточки имели пару входов TEL;CELL;X
Но если такой вход в какой-то карточке только один, то дальше поиск сбивается, и в следующих карточках находится не обязательно только второй вход. Очевидно, в целом код неправильный и уж точно неоптимальный.

Помогите, пожалуйста, кто умеет.

Posted: Sat May 21, 2016 7:57 pm
by YuS
ewild wrote: Помогите, пожалуйста, кто умеет.
На руборде ответ

Posted: Sat May 21, 2016 11:57 pm
by ewild
YuS
Спасибо! Ответил там же.

п.с. в ходе тестов выяснилось, что при использовании SearchReplace.js AkelPad время от времени вылетает у меня, пока неясно почему.

Posted: Sun May 22, 2016 8:12 pm
by KDJ
ewild
Use standard "Replace" dialog.
What:

Code: Select all

(?i-s)(^BEGIN:VCARD\n+)(.{0,9}\n+|(?(?!TEL;CELL;X)(?^BEGIN:VCARD).*\n+))*+(TEL;CELL;X.*\n+)(.{0,9}\n+|(?(?!TEL;CELL;X)(?^BEGIN:VCARD).*\n+))*+(TEL;CELL;)(X.*)
With:

Code: Select all

\1\2\3\4\5RENAMED;\6

Posted: Sun May 22, 2016 10:02 pm
by ewild
KDJ
Great! Yours standard dialog based and YuS's js based methods both give the identical result.

Difference is:
KDJ's method directly reports the appropriate replaces number.
YuS's method reports replaces number that reflected overall VCARD entries count. Thereafter correct replaces number should be recalculated for control purposes as the next step.

Thank you a lot.
Bardzo dziękuję!