Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Частичное совпадение с регуляркой.   Найти похожие ветки 

 
Дмитрий С ©   (2012-05-05 09:19) [0]

Как сделать?
Например есть регулярка:
~^(9\d\d)(\d\d\d)(\d\d)(\d\d)$~
Как можно проверить, что какая либо строка частично соответствует этой регулярке. Частично в данном случае означает, что с начала строки. Например
"914123" - частично соответствует
"014123" - не соответствует частично

Или например такая регулярка:
~^(\d+)/NIC-(A|D|REG)$~

Есть идеи?


 
БарЛог ©   (2012-05-05 09:32) [1]

Свои регулярки написать


 
Медвежонок Пятачок ©   (2012-05-05 09:35) [2]

что значит частично соответствует?

начинается с девятки и имеет после себя несколько цифровых символов?

так это просто. но такой регулярке строка будет соответствовать уже не "частично", а полностью


 
Дмитрий С ©   (2012-05-05 09:43) [3]


> Медвежонок Пятачок ©   (05.05.12 09:35) [2]

Частично, это значит, что строка соответствовала маске, пока не наступил конец этой строки. Т.е. сравнение прервано не из-за того, что строка с какого то символа перестала соответствовать маске, а потому что строка кончилась.


 
Медвежонок Пятачок ©   (2012-05-05 09:46) [4]

ну так ^9\d*


 
БарЛог ©   (2012-05-05 10:20) [5]

> а потому что строка кончилась.

Ну так, может, кусочек следующей тоже проверять?


 
han_malign   (2012-05-05 14:56) [6]

В PCRE есть такие опции...
В TRegExpr можно попробовать (SubExprMatchCount >= 0) and (Match[0] = InputStr)


 
xayam ©   (2012-05-05 23:48) [7]


> ну так ^9\d*

скорей так: ~^9\d{0,9}$~

у него звёздочка не подходит поскольку кол-во цифр известно


 
xayam ©   (2012-05-06 08:59) [8]


> Или например такая регулярка:
> ~^(\d+)/NIC-(A|D|REG)$~
> Есть идеи?

страница 131 в книге http://rutracker.org/forum/viewtopic.php?t=3828631

Условия в ссылках назад.

Но не везде реализовано по-моему...


 
Андреевич   (2012-05-06 12:46) [9]

в pcre они есть, в posix нету


 
xayam ©   (2012-05-06 13:22) [10]

хотя вообще вопрос в другом: с какой целью интересуетесь?


> ~^(9\d\d)(\d\d\d)(\d\d)(\d\d)$~

это явно телефон

> ~^(\d+)/NIC-(A|D|REG)$~

это явно логин (он же номер договора) для входа в руцентр...

Зачем эти вещи могли понадобиться? :)


 
Местный шалун   (2012-05-06 17:19) [11]


>  xayam ©   (06.05.12 13:22) [10]


> Зачем эти вещи могли понадобиться? :)


Жжошь. Браво! :)


 
Дмитрий С ©   (2012-05-07 09:45) [12]


> в pcre они есть, в posix нету

А точнее? Я в PHP весь мануал перечитал - ничего такого не нашел. Там вроде тоже PCRE.

Пока я такое решение нашел:
1. Выбираем символ, который не содержится в строке, например %.
2. Делаем замену в регулярке:
   - В квадратные скобки добавляем %, например [a-z] на [a-z%];
   - Добавляем % к каждому символу, например, \d на [\d%], R на [R%];
   - Заменяем [^...] на (?:[^...]|%)
   - ...
3. Стираем $ в конце регулярки;
4. Добавляем к проверяемой строке несколько символов % (например, 200).
4. Проверяем обычной функцией preg_match.

Вот примеры:
~^([9%][\d%][\d%])([\d%][\d%][\d%])([\d%][\d%])([\d%][\d%])~
~^([\d%]+)[/%][N%][I%][C%][-%]([A%]|[D%]|[R%][E%][G%])~


 
xayam ©   (2012-05-07 12:18) [13]


> Выбираем символ, который не содержится в строке, например %
> ~^([9%][\d%][\d%])([\d%][\d%][\d%])([\d%][\d%])([\d%][\d%])~

а смысл? если % всё равно нет...


 
antonn ©   (2012-05-07 16:35) [14]


> Дмитрий С ©   (07.05.12 09:45) [12]

я чет не понял что нужно сделать.
1 Нужно проверить две подстроки готовой регуляркой?
2 Нужно составить регулярку чтобы проверить две неизвестных подстроки на "похожесть"?


 
Дмитрий С ©   (2012-05-07 16:41) [15]


> antonn ©   (07.05.12 16:35) [14]

Вообще задача проверять соответствие регулярке при вводе. Ввод при этом осуществляется только добавлением или удалением символов справа.


> а смысл? если % всё равно нет...


> 4. Добавляем к проверяемой строке несколько символов % (например,
>  200).


 
antonn ©   (2012-05-07 16:52) [16]


> Вообще задача проверять соответствие регулярке при вводе.
>  Ввод при этом осуществляется только добавлением или удалением
> символов справа.

При вводе подстроки? ну тогда для дельфи есть RegExpr.pas, но он не поддерживает фишки вроде "поиска вперед" (это конструкции типа ?! и ?:). Если задача проверить любую регулярку, то нужно искать компонент ее реализующий.


 
antonn ©   (2012-05-07 16:58) [17]

ну и в догонку, при изменении подстроки (не важно откуда и куда) вызывать is_match (в php она preg_match()) и смотреть возвращаемый результат


 
Дмитрий С ©   (2012-05-08 22:40) [18]


> ну и в догонку, при изменении подстроки (не важно откуда
> и куда) вызывать is_match (в php она preg_match()) и смотреть
> возвращаемый результат

Так не пойдет. Например, тот же логин руцентра:
~^(\d+)/NIC-(A|D|REG)$~
Пользователь ввел: "1234/N" - и как узнать, может это являться началом логина или пользователь уже ошибся? В моей задаче важно это знать уже на этом этапе.
А еще путем перебора очередной буквы можно будет установить, что, например, после ввода символа "/" можно спокойно приписать "NIC-", т.к. других вариантов быть не может.
Эта проблема решена в DevExpress-е вроде. Т.к. там можно указывать RegExpr маски для Edit-ов. Но насколько я понмю, там полностью своя реализация этих самых регулярок.
Я немного поторопился, когда говорил про PHP. Конечно это будет регулярки JavaScript-а, потому что "морда" у меня веб-овская.


 
antonn ©   (2012-05-09 00:26) [19]


> Пользователь ввел: "1234/N" - и как узнать, может это являться
> началом логина или пользователь уже ошибся? В моей задаче
> важно это знать уже на этом этапе.

взять и проверить эту подстроку регуляркой. Если регулярка "прошла" - значит регулярка "подходит" к этой подстроке, со всеми вытекающими. Или нужно "бибикнуть" если после ввода N он введет цифру? Юзерфрендли получше, но костылей тут будет немеряно


 
был здесь   (2012-05-09 08:12) [20]


> других вариантов быть не может

можно список выпадающий сделать с тремя вариантами для
выбора: NIC-A, NIC-D, NIC-REG
а цифры пусть уж вводит


 
Андреевич   (2012-05-09 10:59) [21]

я так понял, что у него разные регулярки, отсюда не предугадаешь с такими списками



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

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.111 c
2-1334809726
leklerk
2012-04-19 08:28
2013.03.22
Компоненты формы не доступны в другой форме


2-1329288943
TNK
2012-02-15 10:55
2013.03.22
Как преобразовать строку в дату.


15-1338975632
Pro_Docent
2012-06-06 13:40
2013.03.22
Кто хочет немного физики?


2-1328430400
FIL-23
2012-02-05 12:26
2013.03.22
переменная типа memo


15-1343593203
alexdn
2012-07-30 00:20
2013.03.22
Марс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский