За последние 24 часа нас посетили 16270 программистов и 1581 робот. Сейчас ищут 1617 программистов ...

анализ регулярных выражений

Тема в разделе "Регулярные выражения", создана пользователем reqyz, 13 май 2016.

  1. reqyz

    reqyz Новичок

    С нами с:
    13 мар 2015
    Сообщения:
    14
    Симпатии:
    0
    Доброго времени суток коллеги)

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

    Понимаю что задача нетривиальная, и никто за меня делать не будет, но может кто то знает опен сорсы, которые решают что то подобное, готовые функции, или другие готовые решения, которые я мог бы переделать, или уже использовать, заранее благодарен
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. reqyz

    reqyz Новичок

    С нами с:
    13 мар 2015
    Сообщения:
    14
    Симпатии:
    0
    по ссылке не нашел исходников, и вроде там для js регулярки анализируются
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    видимо нужно с автором об этом пообщаться или использовать как сервис.

    там не только js, есть переключатель, для PHP переключи PCRE.

    Стоит подучить regex, чтобы не пропустить, то что нужно для решении задачи.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    @reqyz, cдаётся мне, ты излагаешь свою интепретацию задания. А смысл уже потерялся. Давай буквально скопируй сюда текст задания, посмотрим что можно сделать.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    И деньги приготовь ;)
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @artoodetoo а как ты написал два сообщения подряд без склейки?
     
  8. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Это я когда интервал менял ноликом промахнулся. Сейчас нормально все должно быть.
     
  9. reqyz

    reqyz Новичок

    С нами с:
    13 мар 2015
    Сообщения:
    14
    Симпатии:
    0
    задача именно такая, по регулярному выражению подобрать оптимально подходящий тип для поля в бд, тоесть, если регулярное выражения предполагает строки состоящие лишь из цифр, не начинающихся с нуля, которые могут иметь знак минуса в начале, и длина которых от нуля до двух, это тинуинт, строка длина которой от 30 до 50 символов, и которая может иметь любые символы, это варчар длиной 50 символов и т д, регулярки могут быть и более сложными, но функция должна всегда вычислять три значения ля начала, максимальная и минимальная длина, и входящие символы, я не прошу написать за меня, но может кто то знает исходные коды любых анализаторов?
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Для таких простых условия, можно написать регулярные выражения для их определения.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    Вот сейчас стало более понятно, imho. А то показалось, что анализировать надо само регулярное выражение. Оказалось, что анализировать надо таки данные, применяя регулярки.

    Я не припомню чтобы где-то видел такой анализ. Тут помоему только одна хитрость: если поле хоть раз было не-нумерик, значит оно не-нумерик. С min и max длиной очевидно должно быть просто накопление крайних значений.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    Автор извини, у меня без регулярок, но это непринципиально. Для каждого отдельного $value анализ можно делать как с помощью регулярок, так и через Variable handling Functions. Для окончательного вывода важно как значения накапливаются.

    На выходе из цикла:
    Поле целочисленное только тогда, когда is_numeric == true и is_float == false
    Поле вещественное только тогда, когда is_numeric == true и is_float == true
    Поле строковое если is_numeric == false

    Код (PHP):
    1. <?php
    2.  
    3. class Analizator
    4. {
    5.     private $fields = [];
    6.  
    7.     private function doSingle($value)
    8.     {
    9.        
    10.         $is_numeric = is_numeric($value);
    11.         $is_float = $is_numeric && strpos($value, '.') !== false; // don't is_float()!
    12.         $min_len = $max_len = mb_strlen($value);
    13.         return compact('is_numeric', 'is_float', 'min_len', 'max_len');
    14.     }
    15.  
    16.     public function doRow($row)
    17.     {
    18.         foreach ($row as $key => $value) {
    19.             $result = $this->doSingle($value);
    20.             $this->fields[$key] = !isset($this->fields[$key])
    21.                 ? $result
    22.                 : [
    23.                     'is_numeric' => $this->fields[$key]['is_numeric']
    24.                                  && $result['is_numeric'],
    25.                     'is_float'   => $this->fields[$key]['is_float']  
    26.                                  || $result['is_float'],
    27.                     'min_len' => min($this->fields[$key]['min_len'], $result['min_len']),
    28.                     'max_len' => max($this->fields[$key]['max_len'], $result['max_len']),
    29.                 ];
    30.         }
    31.     }
    32.  
    33.     public function result()
    34.     {
    35.         $result = [];
    36.         foreach ($this->fields as $i => $f) {
    37.             $type = 'VARCHAR';
    38.             if ($f['is_numeric'] && !$f['is_float']) {
    39.                 $type = $f['max_len'] <= 2 ? 'TINYINT' : 'INT';
    40.             } elseif ($f['is_numeric'] && $f['is_float']) {
    41.                 $type = 'FLOAT';
    42.             }
    43.             $result[$i] = $type . '('. $f['max_len'] . ')';
    44.         }
    45.         return $result;
    46.     }
    47. }      
    48.  
    49. $analizator = new Analizator();
    50. if (($handle = fopen('test.csv', 'r')) !== false) {
    51.     while (($data = fgetcsv($handle, 1000, ',')) !== false) {
    52.         $analizator->doRow($data);
    53.     }
    54.     fclose($handle);
    55. }
    56. var_export($analizator->result());
    Для таких исходных данных
    Код (Text):
    1. 10, 10, 15, "120"
    2. 15, 10.2, "alfa beta", "120"
    3. 10, 120, 20, "102"
    4. 1, 10, 81, "100"
    5. 2, 86, 11, "120"
    6. -1, 10.2, 75.1, "112"
    будет получен такой результат:
    Код (Text):
    1. array (
    2.   0 => 'TINYINT(2)',
    3.   1 => 'FLOAT(5)',
    4.   2 => 'VARCHAR(9)',
    5.   3 => 'INT(3)',
    6. )
     
  13. reqyz

    reqyz Новичок

    С нами с:
    13 мар 2015
    Сообщения:
    14
    Симпатии:
    0
    спасибо, но я наверно очень плохой объясняльщик, анализируются именно регулярки,

    например входящий параметр = '^[a-zA-Z0-9_]{1,}$' и мы понимаем что минимальная длина строки 1 символ, максимальная - бесконечность, к тому же среди символов есть буквы, а значит оптимальный вариант для выбора типа поля, это текст, неограниченной дллины

    или вот: '([wx])([yz])' - тут очевидна что минимальное и максимальное количество символов = 2, символы включают в себя буквы, а значит оптимальный тип это варчар, длиной 2 символа, и т д

    т.о. анализируются именно регулярки, для выбора правильного типа в бд, при создании таблиц,

    регулярки могут быть и более сложными, то-есть их конструкция не ограниченна