powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
15 сообщений из 15, страница 1 из 1
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206144
last_elf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

Имеется задачка - из 6-значных чисел отобрать все "красивые". На данном этапе хотелось бы "выдрать" числа вида aba(b+1)a(b+2) - здесь каждый множитель означает разряд. Пример чисел: 121314, 515253, 929394.

Поиск по мануалу не дал результата, знаю лишь, как можно указать предыдущее найденное значение. Например: /(.)(.)\\1\\2\\1\\2/ - сработает для сточки `101010`. А как бы указать в качестве шаблона нечто вида (\\1+x), где x - это смещение искомого символа относительно найденного в таблице символов? Какой максимально целесообразный способ решения данной задачки?
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206366
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При данной постановке их проще не "отобрать" а "сгенерировать".
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206379
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, присоединюсь к топикстартеру. Было пару раз, когда требовалось в PCRE какой-то паттерн захватывать не как последовательность символов-цифр от 0 до 9, а именно как строки-числа, скажем, от 1 до 99. И приходилось или отказываться от PCRE или использовать паттерн типа
[1-9]|(?:[1-9][0-9]) - чем больше был интервал, тем хуже был паттерн... а главное под каждый интервал приходилось писать свой паттерн.

Чаще всего решал как (?P<name>[0-9]+), а потом проверял var[name]>=x0, var[name]<=x1, но всегда было интересно - а нет ли встроенного решения?
maytonПри данной постановке их проще не "отобрать" а "сгенерировать".
Всмысле?
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206404
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всего 6 значных чисел - миллион. Красивых чисел - гораздо меньше. По вашему алгоритму это подпоследовательности арифметических прогресий.

101112
111213
121314

И просто повторения

101010
111111
121212

Нетрудно создать генератор этих последовательностей. Работать будет быстрее.
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206445
ResearchStudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проще сэкономить несколько часов, забыть что такое регулярное выражение и написать какую-нибудь простую оценочную функцию для числа
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206534
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, а если надо проверить не число, а именно строку с числом - скажем /value=[1-500]/ - выковыривать число, проверять его отдельно, писать двухэтажный if? Это, конечно, всё можно - но как-то не по прикладному это. :)
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206563
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymmayton, а если надо проверить не число, а именно строку с числом - скажем /value=[1-500]/ - выковыривать число, проверять его отдельно, писать двухэтажный if? Это, конечно, всё можно - но как-то не по прикладному это. :)
Последовательности, которые я привёл выше генерятся без единого "if".

А твой пример строки с числом я чесно говоря не понял.
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206611
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonan0nymmayton, а если надо проверить не число, а именно строку с числом - скажем /value=[1-500]/ - выковыривать число, проверять его отдельно, писать двухэтажный if? Это, конечно, всё можно - но как-то не по прикладному это. :)
Последовательности, которые я привёл выше генерятся без единого "if".

А твой пример строки с числом я чесно говоря не понял.
Напишу на известном мне языке, но думаю смысл поймешь.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function inProgression($number){
	static $progression=array();
	if(!$progression){
		// заполняем массив
	}
	return in_array($progression,$number);
}

$numberToCheck= 123 ;
if(inProgression($numberToCheck)){ /* подходит */ }else{ /* не подходит */ } // легко

$stringWithNumberToCheck='somevalue:123';
if(preg_match('/somevalue:(?P<number>[0-9]+)/',$stringWithNumberToCheck,$matches)){
	if(inProgression[$matches['number']]){ /* подходит */ }else{ /* не подходит */ }
} // нудно

if(preg_match('/somevalue:[1-500]/',$stringWithNumberToCheck)){ /* подходит */ }else{ /* не подходит */ } // хотелось бы
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206623
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно тебе "нудно" писать потому-что не привык систематизировать знания.

Напиши функцию
Код: plaintext
1.
2.
function inProgressionStringWithNumber($string,$number){
 ....
}
которая проверит и строку и число.

Кстати, что это за язык? Перл или Питон?
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206654
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, php.
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206666
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВозможно тебе "нудно" писать потому-что не привык систематизировать знания.

Напиши функцию
Код: plaintext
1.
2.
function inProgressionStringWithNumber($string,$number){
 ....
}
которая проверит и строку и число.
Это всё понятно. Попробую объяснить подробнее - есть два вида задач: сгенерировать все возможные варианты чего-либо по некоторому условию (на примере ТСа условие - соответствие числа виду aba(b+1)a(b+2)) и противоположная - проверить, что некоторый вариант (или малое количество вариантов) соответствует условию.

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

И если бы в PCRE была встроенная возможность рассматривать часть строки как числа плюс уже имеющиеся возможности бэк референса - это бы охватило практически все возможные варианты второго случая. Не скажу за системное программирование, но в прикладном программировании это было бы очень кстати.
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206704
stopor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
умрите, похапешнеги
Код: plaintext
cat source.txt | perl -ne 'print if /(\d)(\d)\1(??{$2+1})\1(??{$2+2})/'
но проверять по сгенеренному словарю всё-равно будет эффективнее
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206716
last_elf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж похоже генерить это самый целесообразный вариант...

stopor
Код: plaintext
cat source.txt | perl -ne 'print if /(\d)(\d)\1(??{$2+1})\1(??{$2+2})/'
А ведь это же то, о чём я так мечтал - на каких реализациях регекспов это поддерживается? Варианта для ПХП нет (пишу-то именно на нём..) ?

Кстати, попробовал сам тут еще поизвращаться, написал шаблоном с поиском по условию:
автор(.)(.)(?(?<=1)(?:\\1)2|(?(?<=2)(?:\\1)3|(?(?<=3)(?:\\1)4|(?(?<=4)(?:\\1)5|(?(?<=5)(?:\\1)6|(?(?<=6)(?:\\1)7|(?(?<=7)(?:\\1)8|(?(?<=8)(?:\\1)9|x))))))))00Выдаёт сие, к примеру, на интервале (200000 , 300000) такой набор:
автор[0] => 212200
[1] => 222300
[2] => 232400
[3] => 242500
[4] => 252600
[5] => 262700
[6] => 272800
[7] => 282900
Вместо 00 в конце надо добавить еще одну скобку автор(?(?<=1)(?:\\1)2|(?(?<=2)(?:\\1)3|(?(?<=3)(?:\\1)4|(?(?<=4)(?:\\1)5|(?(?<=5)(?:\\1)6|(?(?<=6)(?:\\1)7|(?(?<=7)(?:\\1)8|(?(?<=8)(?:\\1)9|(?(?<=9)(?:\\1)0|x)))))))))И тогда сможем искать нужные нам 6значные числа.

Правда таким способом мы не найдём скажем число 2828930 - т.к. здесь уже есть переход на новый десяток.

Да и сама рега помимо зубодробильного вида еще и дико жрёт память, использовать её не реально..
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206719
last_elf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторПравда таким способом мы не найдём скажем число 282930 - т.к. здесь уже есть переход на новый десяток.
...
Рейтинг: 0 / 0
Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
    #36206812
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне почему-то вспомнилась статья одного злобного хацкера, который писал софт для восстановления забытых паролей к WinRAR. За основу был взят генератор паролей на основе выражения похожего по синтаксису на regexp. Генератор не использовал справочники а просто перебирал все возможные варианты. К примеру если пользователь помнил что пароль состоял из 3 символов (alphanum) и одной цифры (number), то генератор перебирал все начиная от 'aaa0' до 'zzz9'.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Регулярное выражение. Найти число, на 1 большее, чем предыдущее найденное
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]