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

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

Post by YuS »

Stranger wrote:Подскажите, как в строке замены в скрипте с использованием AkelPad.TextReplace отделить обратную ссылку (\\1) от цифр последующего текста
Заменить символ цифры кодом. Пример

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

Offline
Posts: 6
Joined: Wed Jan 27, 2016 2:07 pm

Post by Stranger »

Благодарю всех за ответы!
Впрочем, для моей задачи все равно придется воспользоваться каким-то другим инструментом, т.к. выяснилось, что мой скрипт работает неприлично долго (

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Stranger, sed?

Offline
Posts: 6
Joined: Wed Jan 27, 2016 2:07 pm

Post by Stranger »

FeyFre
Нет, помощь друга с использованием node.js ))

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

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

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

Post by YuS »

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

Offline
Posts: 1
Joined: Thu Apr 28, 2016 7:23 am

Post by alexfk »

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

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

Post by YuS »

del (поэкспериментировал и оказалось, что рассуждения не соответствуют действительности.)

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

Code: Select all

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

Offline
Posts: 14
Joined: Sat Jul 05, 2008 11:30 am
Location: Odesa, Ukraine

Post 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
Но если такой вход в какой-то карточке только один, то дальше поиск сбивается, и в следующих карточках находится не обязательно только второй вход. Очевидно, в целом код неправильный и уж точно неоптимальный.

Помогите, пожалуйста, кто умеет.
Last edited by ewild on Sun May 22, 2016 10:19 pm, edited 1 time in total.

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

Post by YuS »

ewild wrote: Помогите, пожалуйста, кто умеет.
На руборде ответ

Offline
Posts: 14
Joined: Sat Jul 05, 2008 11:30 am
Location: Odesa, Ukraine

Post by ewild »

YuS
Спасибо! Ответил там же.

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

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post 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

Offline
Posts: 14
Joined: Sat Jul 05, 2008 11:30 am
Location: Odesa, Ukraine

Post 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ę!
Post Reply