Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Перестановки в регулярных выражениях;)   Найти похожие ветки 

 
Alexander Panov ©   (2005-05-24 15:05) [0]

Столкнулся с задачкой.
Есть набор символов, например - [abcd]

Необходимо проверить строку на совпадение из множества перестановок этих символов.

Что-то непонятно, есть ли такая возможность в рег. выражениях.


 
Alx2 ©   (2005-05-24 15:11) [1]

>Alexander Panov ©   (24.05.05 15:05)  
А зачем искать перестановки?
Проще проверить, что каждый символ строки встречается и в шаблоне и их количество совпадает.


 
MOA ©   (2005-05-24 15:12) [2]

аааа - допустимо?


 
Sergey13 ©   (2005-05-24 15:14) [3]

2[1] Alx2 ©   (24.05.05 15:11)
ИМХО совпадение количества в данном случае лишнее.


 
Alx2 ©   (2005-05-24 15:15) [4]

>Alx2 ©   (24.05.05 15:11)

Э..  в обе стороны проверку надо. Строка-шаблон, Шаблон-строка


 
Alx2 ©   (2005-05-24 15:16) [5]

>Sergey13 ©   (24.05.05 15:14)
Для перестановок не лишнее


 
Sha ©   (2005-05-24 15:18) [6]

На порядок (или два) эффективнее свое написать.


 
Alexander Panov ©   (2005-05-24 15:20) [7]

MOA ©   (24.05.05 15:12) [2]
аааа - допустимо?


Нет, недопустимо.


 
Alexander Panov ©   (2005-05-24 15:28) [8]

Sha ©   (24.05.05 15:18) [6]
На порядок (или два) эффективнее свое написать.


Дело в том, что задача стоит именно с использованием регулярных выражений.

Если это невозможно, тогда буду искать другие пути.


 
Sha ©   (2005-05-24 15:30) [9]

> Alexander Panov ©   (24.05.05 15:28) [8]

Ну тогда перечисли все 24 слова.


 
easy ©   (2005-05-24 15:34) [10]

"#([abcd]{4})#is"
?


 
Игорь Шевченко ©   (2005-05-24 15:37) [11]

А может, ну их нафиг, эти регулярные выражения ? Может эта...нерегулярными обойтись ? А то одна неверно поставленная скобка и аллес гемахт.


 
Ломброзо ©   (2005-05-24 15:38) [12]

m/[a-d][a-d][a-d][a-d]/gi

?

Вот только поисковый движок на таких выражениях имхо падохнет


 
Alexander Panov ©   (2005-05-24 15:41) [13]

Ломброзо ©   (24.05.05 15:38) [12]
m/[a-d][a-d][a-d][a-d]/gi

easy ©   (24.05.05 15:34) [10]
"#([abcd]{4})#is"


А без модификаторов?-0

Похоже, что невозможно это...
А жаль.-)

Игорь Шевченко ©   (24.05.05 15:37) [11]
А может, ну их нафиг, эти регулярные выражения ?


не-е-е... надо использовать достижения цивилизации;)


 
Alexander Panov ©   (2005-05-24 15:41) [14]

Sha ©   (24.05.05 15:30) [9]
Ну тогда перечисли все 24 слова.


Видимо, да. Это вроде бы единственный выход.


 
Ломброзо ©   (2005-05-24 15:42) [15]

Alexander Panov ©   (24.05.05 15:41)

Вообще, у easy правильно. А модификаторы - они чем мешают?


 
Johnmen ©   (2005-05-24 15:42) [16]

>Alexander Panov ©

Мозги правишь Автомодератору ?
:)


 
Alx2 ©   (2005-05-24 15:44) [17]

>Alexander Panov ©
>Johnmen ©   (24.05.05 15:42) [16]

А если все-таки "на матрешках" сначала тренироваться? :)


 
easy ©   (2005-05-24 15:45) [18]

да и без модификаторов -

<?php
$s="В разделе resourcestring файла Consts.pas перевести на русский язык те строки, которые вам необходимы. Можете перевести все, если хотите.
Сохраните копию Consts.pas и пустое приложение вместе в отдельной папке.
Обязательно подключите модуль Consts.pas(если вы его не подключили) к сохранённому приложению и сохраните приложение ещё раз.
Обратите внимание: приложение должно использовать модуль Consts.pas, сохранённый вами вместе с самим приложением, а не из папки …\DelphiX\Source\Vcl. Чтобы убедиться в этом, закройте страницу Consts.pas, затем, удерживая Ctrl, кликните мышью в разделе модулей по слову Consts – должен открыться файл Consts.pas непосредственно из того места, где вы его сохранили.
Запустите приложение. После того, как вы его запустили, в папке с приложением должен появиться файл Consts.dcu.
В папке с сохранённым приложением у вас помимо прочих файлов типа Unit1.pas или project1.res должны быть следующие: Consts.pas и Consts.dcu. ";
$reg="маи";
echo preg_replace( "#([$reg]{".strlen($reg)."})#"  , "\\1", $s );
?>


найдёт има,ами,мим
не знаю это то что надо или нет..


 
Игорь Шевченко ©   (2005-05-24 15:45) [19]

Alexander Panov ©   (24.05.05 15:41) [13]


> не-е-е... надо использовать достижения цивилизации


Не советую. Слишком легко вместе с водой выплеснуть ребенка.


 
Alexander Panov ©   (2005-05-24 15:45) [20]

Johnmen ©   (24.05.05 15:42) [16]

Мозги правишь Автомодератору ?


уг.

Ломброзо ©   (24.05.05 15:42) [15]
Вообще, у easy правильно. А модификаторы - они чем мешают?


А непонятно, что это за модификаторы.
В каждом движке свои модификаторы.


 
False_Delirium ©   (2005-05-24 15:46) [21]

Одним регулярным выражением ?

Одним - наврятли. Если есть, то крайне неэффективно.

Другой способ - сначала разбить на все возможные вхождения по 4 символа удовлетворяющих множество.
Затем каждый кусок проверить на присутствие в единичном количестве всех элементов множества.


 
Alexander Panov ©   (2005-05-24 15:47) [22]

easy ©   (24.05.05 15:45) [18]

Нужно средствами шаблона, а здесь перловый движок.


 
Alexander Panov ©   (2005-05-24 15:48) [23]

False_Delirium ©   (24.05.05 15:46) [21]
Одним регулярным выражением ?


Необязательно одним, можно и последовательными проверками, но только не общего количества перестановок-)


 
Ломброзо ©   (2005-05-24 15:49) [24]

Alexander Panov ©   (24.05.05 15:45)

А непонятно, что это за модификаторы.


Я знаком с перловым, Java и микрософтовским. Основных модификатора три, и они присутствуют во всех этих движках: глобальный поиск (g), игнорирование регистра (i) и трактование переноса строки как пробельного символа (s)


 
Alexander Panov ©   (2005-05-24 15:51) [25]

Ломброзо ©   (24.05.05 15:49) [24]

Модификаторы

Модификаторы служат для изменения режимов работы TRegExpr.

Вы можете изменять модификаторы несколькими способами.

Любой модификатор может меняться с помощью специальной конструкции (?...) внутри регулярного выражения.

Также, Вы можете присвоить значение соответствующему свойству экземпляра объекта TRegExpr (например, ModifierX для изменения модификатора /x, или ModifierStr для изменения сразу нескольких модификаторов). Значения по умолчанию для новых экземпляров объектов TRegExpr определены в глобальных константах, например RegExprModifierX определяет значение по умолчанию для ModifierX.

i

Регистро-независимый режим (по умолчанию использует выбранный в ОС язык по умолчанию), (см. также InvertCase)

m

Воспринимать входной текст как многострочный, при этом метасимволы "^"" и "$"" будут совпадать не только в начале и конце текста в целом, но и в начале и в конце всех имеющихся в тексте строк (см. также Разделители строк)

s

Воспринимать входной текст как одну строку. При этом метасимвол "."" совпадает с любым символом, если же этот модификатор выключен, то он не совпадает с разделителями строк (см.также Разделители строк).

g

Не стандартный модификатор. Выключая его Вы переключаете все повторители в "не жадный" режим (по умолчанию этот модификатор включен). Т.е. если его отключить, то все "+" работают как "+?", "*" как "*?" и т.д.

x

Позволяет форматировать шаблон чтобы обеспечить более легкую читаемость (см. описание ниже).

r

Не стандартный модификатор. Если включен, то диапазоны вида а-я включают также букву "ё", А-Я  включают "Ё", а а-Я включает вообще все русские буквы.


 
easy ©   (2005-05-24 16:12) [26]

var
 abcd,expr:string;
begin
 abcd := "abcd";
 expr:="(?i)(["+abcd+"]{"+inttostr(length(abcd))+"})";
 caption:=booltostr(ExecRegExpr(expr,Memo1.Text),true);
end;


 
Alexander Panov ©   (2005-05-24 16:17) [27]

easy ©   (24.05.05 16:12) [26]

(?i)([abcd]{4})

Срабатывает на строку "aabb"


 
MOA ©   (2005-05-24 16:37) [28]

Я тут подумал - а ведь требование "перестановки из Н неповторяющихся символов", похоже -  не есть регулярная, она даже и не контекстно-свободная грамматика...


 
Sha ©   (2005-05-24 16:52) [29]

На Паскале примерно так:

procedure TForm1.Button1Click(Sender: TObject);
const
 pattern: string="abcd";
var
 s: string;
 mem: array[0..255] of integer;
 cur, last, dist, len, ch, count: integer;
begin;
 len:=Length(pattern);
 FillChar(mem[0],256*4,255);
 for cur:=1 to len do mem[ord(pattern[cur])]:=0;

 s:="aaabcabd";
 count:=0;
 for cur:=1 to length(s) do begin;
   ch:=ord(s[cur]);
   last:=mem[ch];
   if last<0 then count:=0
   else begin;
     mem[ch]:=cur;
     dist:=cur-last;
     if dist<len then count:=dist
     else begin;
       inc(count);
       if count>=len then break;
       end;
     end;
   end;
 Caption:=IntToStr(count);
 end;


 
Igorek ©   (2005-05-24 17:02) [30]

Alexander Panov ©   (24.05.05 15:05)
Если для проверки полагаться целиком на регулярное выражение (правильная строка - это грамматически правильная строка), то оно будет достаточно громоздким. Напр. для "abc" - "a(bc|cb)|b(ac|ca)|c(ab|ba)". Для генерации сией трахомудии можно использовать такой код:
//написал по быстрому, жутко неефективный, прошу не пинать

function MakeRegExpr(const str: string): string;

 function _Exclude(const str: string; X: Integer): string;
 var
   I: Integer;
 begin
   result := "";
   for I := 1 to Length(str) do
     if I <> X then
       result := result + str[I];
 end;

var
 I, L: Integer;
begin
 L := Length(str);
 if L = 1 then
   result := str[1]
 else
 begin
   result := "";
   for I := 1 to L do
   begin
     if I > 1 then
       result := result + "|";
     result := result + str[I];
     if L > 2 then
       result := result + "(";
     result := result + MakeRegExpr(_Exclude(str, I));
     if L > 2 then
       result := result + ")";
   end;
 end;
end;


 
Alexander Panov ©   (2005-05-24 17:04) [31]

да, похоже, что проще реализовать обработку флажка, и функцию проверки на ссоответствие перестановке.


 
Igorek ©   (2005-05-24 17:04) [32]

Удалено модератором


 
Ломброзо ©   (2005-05-24 17:04) [33]

Igorek ©   (24.05.05 17:02)
Alexander Panov ©   (24.05.05 15:05)


IncDay №2


 
Alexander Panov ©   (2005-05-24 17:06) [34]

Sha ©   (24.05.05 16:52) [29]
Igorek ©   (24.05.05 17:02) [30]

Спасибо.


 
DiamondShark ©   (2005-05-24 17:11) [35]

Удалено модератором
Примечание: Самый верный способ испортить отношения - это начать их выяснять. /Николай Векшин/ (AutoModerator)


 
MOA ©   (2005-05-24 17:12) [36]

Кстати, если писать программульку и важно быстродействие - можно завести массив с буквами (в пределе - 256) и счётчиком. После разбора - пробежаться по массиву счётччиков, если везде 1 - совпадение, иначе нет. Должно получиться очень просто (тупой цикл по Н эл-там строки + цикл по счётчикам) и очень быстро ;).


 
Alexander Panov ©   (2005-05-24 17:13) [37]

DiamondShark ©   (24.05.05 17:11) [35]

Соревнования не будет. Будет R/O.
Чик. Все просто.


 
Alexander Panov ©   (2005-05-24 17:13) [38]

Alexander Panov ©   (24.05.05 17:13) [37]
Будет R/O.


Причем навечно.


 
DiamondShark ©   (2005-05-24 17:16) [39]

Робот на РО не обидится ;)


 
Alexander Panov ©   (2005-05-24 17:17) [40]

DiamondShark ©   (24.05.05 17:16) [39]
Робот на РО не обидится


А все бредогенераторы только так и блокируются.



Страницы: 1 2 вся ветка

Текущий архив: 2005.06.14;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.025 c
3-1115277422
Dels
2005-05-05 11:17
2005.06.14
Компонент DBMemo в Windows XP


1-1117043182
KLOPs
2005-05-25 21:46
2005.06.14
Двоичный --в--> десятичный


9-1110321672
Куу
2005-03-09 01:41
2005.06.14
ODE-бильярдик Простенький Демка


1-1117451915
Mouserx
2005-05-30 15:18
2005.06.14
Использование inherited


14-1116755818
Igorek
2005-05-22 13:56
2005.06.14
Воскресный флэшовый квест :8-)