€
$
₴
₽
EN
RU
Vmeste.EU
Лента
Каталог
Файлы
Форумы
Услуги
Основное
Radiotalk
Пользовательское
Программирование
6 •
Посмотреть все темы
регулярка
1
4875
ValdeZ
@ValdeZ
18.12.2011
Всем привет. Есть кто-то разбирающийся в регулярных выражениях?
Нужна регулярка, которая бы выполняла следующее:
на входе - число в HEX
регулярка должна отсеивать эти числа и возвращать только такие:
1. В числе нет больше 3 цифр подряд (любых, просто чтобы не попадалось больше 3 цифр рядом)
2. В числе нет больше 2 букв подряд (аналогично)
к сожалению в regexp не разбираюсь, но задание и работа очень горит
заранее благодарен за помощь или подсказки
Отредактировано ValdeZ -
18.12.2011
284
arteshuk
@arteshuk
18.12.2011
я думаю, для начало это число в HEX надо преобразовать у "удобоваримый" вид....а уж потом regexp "подтянуть".....
4875
ValdeZ
@ValdeZ
18.12.2011
arteshuk
пишет:
я думаю, для начало это число в HEX надо преобразовать у "удобоваримый" вид....а уж потом regexp "подтянуть".....
нет-нет
в моей задаче нужно именно разбирать HEX-числа
скажем, мне ими нужно работать не в их числовом значении
эти числа являются частью некоторых стром
2970
удалён
@Foggy
18.12.2011
Кому лень читать, сразу пишу: задачу я не решил.
Сегодня в 2 ночи (мск) увидел эту тему и заинтересовался решением. Дай-ка, думаю, и помогу человеку и регулярки заодно изучу. В течение 3 часов изучал регулярки, ибо прежде почти совсем их не понимал. В итоге начал пытаться решить проблему. Убил ещё три часа на это. Облазал кучу форумов по регуляркам, кучу сайтов, кучу статей перечитал, изучил кучу тонкостей. Но в итоге так и не смог решить эту с виду лёгкую задачу. Если кто будет пытаться её решить, а я на это очень надеюсь, ибо очень интересно решение того, на что я потратил 6 часов и не решил. Почитайте мои рассуждения и попытки под катом:
Показать текст
Вначале я вник в условия и написал первый вариант регулярки:
([A-Fa-f]){1,2}|([0-9]){1,3}
Из неё следует, что входные данные пройдут, только в двух случаях: 1. Если будет от одного до двух символов на входе и больше ничего. 2. Если будет от единицы до трёх на входе и больше ничего. После я долго пытался искать мелкие юркие решения повторения символов, искал, как можно без "или". В итоге пришёл к вот такой большой регулярке:
/^(([0-9]?){1,3}([A-Fa-f]?){1,2}([0-9]?){1,3}([A-Fa-f]?){1,2}([0-9]?){1,3}){6}$/m
Разберём сию кашу от краёв до центра:
^ и $ - символы начала и конца строки.
(...){6} - код внутри первых скобок должен содержать ровно 6 символов, ибо водящие данные это hex, а он может состоять либо из 3, либо из 6 символов, не беря в счёт решётку. Я не стал заморачиваться по поводу 3, ибо в условии задачи не может быть более трёх чисел, а в поле с трёмя символами больше трёх чисел не может быть по определению.
/.../m - в учебниках это зовётся многострочный поиск, а я это понимаю как вложенные регулярки))
А вот дальше самая замута. Я знаю, как в регулярках искать повторяющийся символ, но не знаю, как искать повторяющуюся последовательность символов. Ещё одна проблема в позиции внутри входящих данных. Если бы задача состояла в запрете скольких угодно букв или цифр подряд в начале строки - это не проблема. Или, например, нужно было бы, чтоб пропускало только парные последовательности. например, пропускало бы aa55ff или ee11cc, но не пропускало бы ae11cc или 55vvdc. Такая ситуация тоже не проблема. Но три последовательных числа и две последовательных буквы должны быть в любом месте. Как это реализовать короткими регулярками я понятия не имею. Тогда я заморочился длинной записью. Попытался на каждый введённый символ сделать проверку. Вначале у меня проверяется первый символ. Он должен быть числом от 0 до 9. Знак вопроса означает, что он может быть, а может и не быть. Ведь введённые данные могут начинаться как с числа, так и с буквы. Подряд может идти до трёх чисел, поэтому проверка идёт от 1 до 3. Дальше тоже самое для букв. Сия ситуация повторяется столько раз, сколько минимально может быть на входе. Но в таком случае получается недодача. То есть на входе может быть 5 символов, например, 1a3c2. В таком случае входные данные не пройдут из-за правила про hex (...){6}. Увеличивать в какой-то из позиций начальную границу на 2, чтобы минимальное число было равно нужному, то есть шести, тоже не логично, так сказать не честно. Да и вызовет глюки обязательно. Ну и самое главное и самое элементарное, почему такой вариант не подойдёт: возможен вариант, что человек не введёт букв вообще, тогда сработают две регулярки на числа и безоговорочно пропустят входные данные из 3-6 чисел, что тоже не допустимо по условию.
Куда вести свои рассуждения дальше, я не знаю. Если я где-то ошибся - прошу меня поправить.
Очень надеюсь, что кто-нибудь решит задачу.
ValdeZ
, скажи, пожалуйста, зачем нужна эта проверка? Я вот ею заморочился, чтобы регулярки изучить, но зачем она требуется, так и не понял. Если бы было не больше двух символов A-Fa-f0-9, то это и решить я
**********
как и понимаю, зачем нужно (понимаю такое ограничение палитры, типа safe colors). Но зачем тебе то, что ты указал?
4875
ValdeZ
@ValdeZ
18.12.2011
Foggy
пишет:
Кому лень читать, сразу пишу: задачу я не решил.
Сегодня в 2 ночи (мск) увидел эту тему и заинтересовался решением. Дай-ка, думаю, и помогу человеку и регулярки заодно изучу. В течение 3 часов изучал регулярки, ибо прежде почти совсем их не понимал. В итоге начал пытаться решить проблему. Убил ещё три часа на это. Облазал кучу форумов по регуляркам, кучу сайтов, кучу статей перечитал, изучил кучу тонкостей. Но в итоге так и не смог решить эту с виду лёгкую задачу. Если кто будет пытаться её решить, а я на это очень надеюсь, ибо очень интересно решение того, на что я потратил 6 часов и не решил. Почитайте мои рассуждения и попытки под катом:
Показать текст
Вначале я вник в условия и написал первый вариант регулярки:
([A-Fa-f]){1,2}|([0-9]){1,3}
Из неё следует, что входные данные пройдут, только в двух случаях: 1. Если будет от одного до двух символов на входе и больше ничего. 2. Если будет от единицы до трёх на входе и больше ничего. После я долго пытался искать мелкие юркие решения повторения символов, искал, как можно без "или". В итоге пришёл к вот такой большой регулярке:
/^(([0-9]?){1,3}([A-Fa-f]?){1,2}([0-9]?){1,3}([A-Fa-f]?){1,2}([0-9]?){1,3}){6}$/m
Разберём сию кашу от краёв до центра:
^ и $ - символы начала и конца строки.
(...){6} - код внутри первых скобок должен содержать ровно 6 символов, ибо водящие данные это hex, а он может состоять либо из 3, либо из 6 символов, не беря в счёт решётку. Я не стал заморачиваться по поводу 3, ибо в условии задачи не может быть более трёх чисел, а в поле с трёмя символами больше трёх чисел не может быть по определению.
/.../m - в учебниках это зовётся многострочный поиск, а я это понимаю как вложенные регулярки))
А вот дальше самая замута. Я знаю, как в регулярках искать повторяющийся символ, но не знаю, как искать повторяющуюся последовательность символов. Ещё одна проблема в позиции внутри входящих данных. Если бы задача состояла в запрете скольких угодно букв или цифр подряд в начале строки - это не проблема. Или, например, нужно было бы, чтоб пропускало только парные последовательности. например, пропускало бы aa55ff или ee11cc, но не пропускало бы ae11cc или 55vvdc. Такая ситуация тоже не проблема. Но три последовательных числа и две последовательных буквы должны быть в любом месте. Как это реализовать короткими регулярками я понятия не имею. Тогда я заморочился длинной записью. Попытался на каждый введённый символ сделать проверку. Вначале у меня проверяется первый символ. Он должен быть числом от 0 до 9. Знак вопроса означает, что он может быть, а может и не быть. Ведь введённые данные могут начинаться как с числа, так и с буквы. Подряд может идти до трёх чисел, поэтому проверка идёт от 1 до 3. Дальше тоже самое для букв. Сия ситуация повторяется столько раз, сколько минимально может быть на входе. Но в таком случае получается недодача. То есть на входе может быть 5 символов, например, 1a3c2. В таком случае входные данные не пройдут из-за правила про hex (...){6}. Увеличивать в какой-то из позиций начальную границу на 2, чтобы минимальное число было равно нужному, то есть шести, тоже не логично, так сказать не честно. Да и вызовет глюки обязательно. Ну и самое главное и самое элементарное, почему такой вариант не подойдёт: возможен вариант, что человек не введёт букв вообще, тогда сработают две регулярки на числа и безоговорочно пропустят входные данные из 3-6 чисел, что тоже не допустимо по условию.
Куда вести свои рассуждения дальше, я не знаю. Если я где-то ошибся - прошу меня поправить.
Очень надеюсь, что кто-нибудь решит задачу.
ValdeZ
, скажи, пожалуйста, зачем нужна эта проверка? Я вот ею заморочился, чтобы регулярки изучить, но зачем она требуется, так и не понял. Если бы было не больше двух символов A-Fa-f0-9, то это и решить я
**********
как и понимаю, зачем нужно (понимаю такое ограничение палитры, типа safe colors). Но зачем тебе то, что ты указал?
В общем, в моём случае мне приходится парсить ссылки в которых есть нужная мне часть в виде этого злого HEX. На вход поступают сотни тысяч ссылок, из которых мне нужна лишь определённая группа (критерии по которой я указал выше). Не с цветом, нет. В итоге, поступает типа:
**********
- это подходит, а
**********
- не подходит
Спасибо огромное, конечно. Твоё благородство натолкнуло меня на то, чтобы и самому засесть почитать про регулярки материал 😀
Отредактировано ValdeZ -
18.12.2011
2970
удалён
@Foggy
23.12.2011
Жестяк. Вряд ли выйдет. Рекомендую обрабатывать js или php функциями, иначе вряд ли выйдет. Если нет такой возможности - стоит об этом забыть, я думаю. Или, может быть, ты что-нибудь придумал?
4875
ValdeZ
@ValdeZ
23.12.2011
Foggy
пишет:
Жестяк. Вряд ли выйдет. Рекомендую обрабатывать js или php функциями, иначе вряд ли выйдет. Если нет такой возможности - стоит об этом забыть, я думаю. Или, может быть, ты что-нибудь придумал?
Придумал: с помощью танцев с бубном из всех 8-разрядных 16-ричных чисел выбрал всё что не нужно и составил список вариантов для проверки.
Т.е. проверяю всё на соответствие со словарём.
2970
удалён
@Foggy
23.12.2011
И как оно в итоге выглядит?
4875
ValdeZ
@ValdeZ
23.12.2011
Foggy
пишет:
И как оно в итоге выглядит?
исходники по-позже
пока что я остановился на составлении самого словаря
сам словарь делался так:
на джаваскрипте делался цикл, который выводил все числа от 1 до 4294967295 в 16-ричном формате (в много этапов, не сразу от 1 до ..., потому что при попытках сделать за один проход браузер тупо ложил систему)
потом копировал это всё в ноутпад и с помощью различных поисковых запросов по файлу удалялось всё ненужное
в итоге вышло в много раз меньше вариантов, чем было изначально
сделаю по этому варианту
скорее всего на Питоне
потом, если придумаю как поступить с изначальной идеей - сделаю по другому и сравню скорости выполнения
доведу программу до ума - скину тебе первому
P.S. 9-я мозилла вместо вывода цикла из 200 000 16-ричных чисел тупо ложит систему
9-й ИЕ (64-х разрядный) выполняет задачу за 15 секунд
да уж)
Отредактировано ValdeZ -
23.12.2011