AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Регулярные выражения
Goto page Previous  1, 2, 3 ... 14, 15, 16 ... 18, 19, 20  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian)
View previous topic :: View next topic  
Author Message
Serge Yolkin



Joined: 27 Jul 2010
Posts: 255

PostPosted: Sat Feb 08, 2014 8:35 pm    Post subject: Reply with quote

Drugmix
Э-э-э... Похоже, мне требуется переводчик. Про (?= я знаю, меня озадачило выражение (?> , про которое Вы написали
Quote:
теперь работает
...
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 423

PostPosted: Sat Feb 08, 2014 8:51 pm    Post subject: Reply with quote

я криво выразился. Я думал, что YuS не в курсе про добавленные positive/negative look ahead/behind'ы. Они теперь работают. Просто в AP positive look ahead реализован через (?= который легко перепутать с (?> по аналогии с positive look behind (?<

Возможно, стоило бы приравнять (?> к (?= и разрешить двоякое употребление.
Back to top
View user's profile Send private message
YuS



Joined: 15 Sep 2013
Posts: 106

PostPosted: Sun Feb 09, 2014 5:30 am    Post subject: Reply with quote

Drugmix wrote:
YuS
теперь работает, просто оно лишнее там.

Если оно работает так, как именно написано, то оно вовсе не лишнее, ибо вопрос был задан про:
Quote:
Cкажите, что быстрее

а это наиболее быстрая из видов групп в регулярках, т.к. в ней нет возврата по строке и она запрещает проверку при первом же найденном варианте внутри группы.

Drugmix wrote:

Возможно, стоило бы приравнять (?> к (?= и разрешить двоякое употребление.

Это не одно и то же...


Last edited by YuS on Sun Feb 09, 2014 5:38 am; edited 1 time in total
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 423

PostPosted: Sun Feb 09, 2014 10:08 am    Post subject: Reply with quote

YuS
О как. Я не знал.
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1616

PostPosted: Wed Feb 12, 2014 8:02 am    Post subject: Reply with quote

Выражение:
Code:
^(`[^\n\r]+?[^\.!:])<br>$

Текст для проверки:
Code:
Don't change me<br>
`but change me<br>
`and me<br>
`except me!<br>

Предполагается замена на
Code:
\1.<br>

(в SearchReplace.js работает)
Back to top
View user's profile Send private message Visit poster's website
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5358

PostPosted: Wed Feb 12, 2014 1:50 pm    Post subject: Reply with quote

Infocatcher
Все верно. Попробуйте поискать
Code:
`[^\n\r]+?[^\.!:]
, чтобы понять почему не находит. Для данной задачи можно так:
Code:
^(`[^\n\.!:]+?)<br>$
Back to top
View user's profile Send private message Send e-mail
Drugmix



Joined: 08 Apr 2013
Posts: 423

PostPosted: Wed Feb 12, 2014 2:54 pm    Post subject: Reply with quote

Instructor
судя по тому, как было составлено правило у Infocatcher'а - предполагаю, что ему нужно было составить шаблон так, чтобы замена сработала и на строках, содержащих !.:, но только если они идут не последним символом перед <br>.
Ваше же правило не сработает ни на одной из этих строк:
Code:
`.change me<br>
`and me too! please<br>
`me: wants to be changed too<br>


Поэтому для данной задачи, видимо, лучше как-то так:
Code:
^(`[^\n\r]+?)(?<![\.!:])<br>$


Last edited by Drugmix on Wed Feb 12, 2014 3:36 pm; edited 1 time in total
Back to top
View user's profile Send private message
Infocatcher



Joined: 06 Aug 2007
Posts: 1616

PostPosted: Wed Feb 12, 2014 2:54 pm    Post subject: Reply with quote

Instructor wrote:
Для данной задачи можно так:
Code:
^(`[^\n\.!:]+?)<br>$
То есть если требуется разрешить точки в строках (но не в конце), то ничего не сделать? Типа вот такого:
Code:
`Also. Should. Be. Changed<br>
Back to top
View user's profile Send private message Visit poster's website
Infocatcher



Joined: 06 Aug 2007
Posts: 1616

PostPosted: Wed Feb 12, 2014 3:47 pm    Post subject: Reply with quote

Drugmix wrote:
Поэтому для данной задачи, видимо, лучше как-то так:
Code:
^(`[^\n\r]+?)(?<![\.!:])<br>$
Спасибо, это гораздо лучше.
Только не понятно, в чем тут отличие с точки зрения редактора.
То есть почему не работает мой вариант понятно (но это все равно не радует), а вот почему (с учетом предыдущего) работает шаманство с (?<! ...) – не понятно.
Back to top
View user's profile Send private message Visit poster's website
Drugmix



Joined: 08 Apr 2013
Posts: 423

PostPosted: Wed Feb 12, 2014 4:06 pm    Post subject: Reply with quote

Infocatcher wrote:
Только не понятно, в чем тут отличие с точки зрения редактора.
То есть почему не работает мой вариант понятно (но это все равно не радует), а вот почему (с учетом предыдущего) работает шаманство с (?<! ...) – не понятно.

Группа перед (?<!…) - жадная и съедает всё что может да побольше, (поэтому твой вариант и не работал, т.к. второй группе не оставалось на съедение даже 1 символа, а 1 символ не может съедаться разными группами дважды).
А (?<!…) - группа, которая не ест, и работает как фильтр: выполняет проверку символов слева и если надо - отменяет работу всего выражения целиком.
Back to top
View user's profile Send private message
YuS



Joined: 15 Sep 2013
Posts: 106

PostPosted: Thu Feb 13, 2014 5:48 pm    Post subject: Reply with quote

Infocatcher wrote:
То есть если требуется разрешить точки в строках (но не в конце), то ничего не сделать? Типа вот такого:
Code:
`Also. Should. Be. Changed<br>

Это не совсем так. Учитывая тот факт, что групп может быть больше чем одна, то вполне реализуется вот такой вариант:
Code:
Что: ^(`[^\n\r]+?)([^.!:])<br>$
Чем: \1\2.<br>


Infocatcher wrote:

Только не понятно, в чем тут отличие с точки зрения редактора.
То есть почему не работает мой вариант понятно (но это все равно не радует), а вот почему (с учетом предыдущего) работает шаманство с (?<! ...) – не понятно.

Ну, как же? Отличие значительное, ведь negative lookbehind вполне работает по своему назначению, т.е. если буквально прочитать выражение:
Совпадает, если сразу за началом строки следуют символ "`", далее следует один или более символов "[^\n\r]", в наименьшем возможном сочетании и при условии отсутствия в последнем символе любого из перечисленных в классе "[\.!:]", далее следуют символы "<br>$" - как-то так.
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 423

PostPosted: Thu Feb 13, 2014 8:28 pm    Post subject: Reply with quote

EDIT: разобрался.

Last edited by Drugmix on Thu Feb 13, 2014 11:55 pm; edited 1 time in total
Back to top
View user's profile Send private message
bayzhanov



Joined: 12 May 2013
Posts: 4

PostPosted: Tue Mar 11, 2014 5:51 pm    Post subject: Reply with quote

Подскажите а как реализовать поиски такого типа:
Предположим даны буквы "аеикмнопрстучя" и словарь русского языка в txt.
Задача: составь из этих букв как можно больше слов(читай поиск в словаре), НО буквы не повторяются( т.е. например буква "а" может в слове встречаться только 1 раз).
Вот как мне кажется решение с повторами букв:
egrep -w '[аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя][аеикмнопрстучя]' rus.txt
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2040
Location: Vinnitsa, Ukraine

PostPosted: Tue Mar 11, 2014 10:30 pm    Post subject: Reply with quote

bayzhanov, "Эрудит" какой-то играете чтоли? ))
Обратились бы на спец ресурс по регуляркам.
Надеюсь число букв в слове конечно и определенно?
Идея есть, для малого количества букв даже в голову регулярка вкладывается, и добавление очередной буквы операция в общем то однотипная , но размер регулярки будет расти в геометрической прогрессии.
Идея такая:
для 1-буквенного слова: [набор] понятно.
(Для простоты обозначим этот [набор] как Q что-бы не загромождать текст)
для 2-буквенного слова: (Q)(?=Q)([^\1]) т.е 1 буква - одна из набора. вторая из 2х частьей:
(?=Q) - positive lookahead - "проверить, не подходит ли текущая позицая к регулярке Q нашему набору, но не захватывать)
([^\1]) - захватить любой символ кроме того который был захвачен ранее.
3 буквы: (Q)(?=Q)([^\1])(?=Q)([^\1\2]) - суть выделенного фрагмента выше описано.
Ну и далее выделенный и дополненный фрагмент дописываем. Имее в итоге
Code:
1:(Q)
2:(Q)(?=Q)([^\1])
3:(Q)(?=Q)([^\1])(?=Q)([^\1\2])
4:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])
5:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])
6:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])(?=Q)([^\1\2\3\4\5])
7:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])(?=Q)([^\1\2\3\4\5])(?=Q)([^\1\2\3\4\5\6])
8:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])(?=Q)([^\1\2\3\4\5])(?=Q)([^\1\2\3\4\5\6])(?=Q)([^\1\2\3\4\5\6\7])

Не забываем ^ и $ в начале и конце выражения.
В итоге один такой червяк ищет слово по указанному критерию. Сразу всплывает ограничение: backref-ов в большинстве движков может быть только 9: \1-\9, а значит подобное выражение может поймать максимум 10-буквенное слово.
При этом набор Q=[набор] может быть и длинее чем кол-во букв в слове, но не короче, иначе конец регулярки будет всегда отказывать: (?=[abc]) сработает, но [^abc] откажет.

Обратите внимание, указанная регулярка строгая - находит слова конкретной длинны, слова по короче найдены не будут.

Домашнее задание: модифицировать регулярку так, чтобы находила и слова по-короче. Сдать до пятницы. Very Happy
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
bayzhanov



Joined: 12 May 2013
Posts: 4

PostPosted: Tue Mar 18, 2014 8:41 pm    Post subject: Reply with quote

не работает (((
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian) All times are GMT
Goto page Previous  1, 2, 3 ... 14, 15, 16 ... 18, 19, 20  Next
Page 15 of 20

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group