Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   повторный вызов regexp (https://javascript.ru/forum/misc/28656-povtornyjj-vyzov-regexp.html)

DmitryK1 28.05.2012 14:22

повторный вызов regexp
 
Создаю регексп в глобальной области видимости.
var re = new RegExp("(\\d*)#(\\d*)", "ig");


Обращаюсь к нему в процедуре:
var arr = re.exec(tmp);


В первый раз всё работает, потом перестаёт искать.
Прочитал что устанавливается переменная начала поиска в последний найденный символ (его позицию).

Написал везде где вызывается так:
re.lastIndex = 0;
   var arr = re.exec(tmp);


Но как-то это не очень красиво. А есть другие варианты решения проблемы?

Deff 28.05.2012 15:57

DmitryK1,
Выложили б полный код и образчик строки tmp

DmitryK1 29.05.2012 07:23

Хм.. Там кода много и он не нужен для вопроса, как мне казалось, но если надо, так вот:
<!DOCTYPE HTML>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>

  <style type="text/css">
  </style>
</head>
<body>

<div id="controls">

<select id="CurrentYear">

  <option value="2011">2011</option>

</select>

<select id="CurrentMonth">
  <option value="01">01 Январь</option>

</select>

</div>

    <div id="myGrid" style="width:100%;height:700px;"></div>

<script type="text/jscript" src="./js/mleibman-SlickGrid/lib/jquery-1.7.min.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/lib/jquery-ui-1.8.16.custom.min.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/lib/jquery.event.drag-2.0.min.js"></script>

<script type="text/jscript" src="./js/mleibman-SlickGrid/slick.core.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/slick.editors.js"></script>
<script type="text/jscript" src="./js/mleibman-SlickGrid/slick.grid.js"></script>

<script type="text/jscript" >
  var grid;
  var data = [];

  var curMonth;
  var curYear;


  var columns=[];
  var temp;



  // создаём статические столбцы.
  temp = columns.push({ id: "fio", name: "Сотрудник", field: "fio", width: 250, cssClass: "cell-title" });

//!!!!!!! Вот он!!!
  //создаём регексп для работы с данными (12#2)
  var re = new RegExp("(\\d*)#(\\d*)", "ig");

  // создаём динамические столбцы и функции
  var number = 31; // hardcoded забитое количество столбцов. Дальше надо будет вычислять это количество
  var NumericRangeFunc = createFormatterS(number);

  for (var i = 1; i <= number; i++) {
      temp = columns.push({ id: "day" + i, name: i, width: 40, formatter: NumericRangeFunc[i].f, editor: NumericRangeFunc[i].e });
  }

  var options = {
    editable: true,
    enableAddRow: false,
    enableCellNavigation: true,
    asyncEditorLoading: false
  };


  setMonth();


  function setMonth() {

      $("#CurrentMonth option[value='06']").attr("selected", "selected");
       curMonth = $("#CurrentMonth option:selected").val();
      curYear = $("#CurrentYear option:selected").val();
  }

  // Создает number таких функций  - форматтеров и возвращает их массив.
function createFormatterS(number) {
    var arr = [];
    for (var i = 1; i <= number; i++) {
        arr[i] = {f:createNumericRangeFormatter(i),e:createNumericRangeEditor(i)};
    }
    return arr;
}
//устанавливает текущие значения месяца и года


// Создает Элемент массива функций - форматтеров.
function createNumericRangeFormatter(n) {

    return function (row, cell, value, columnDef, dataContext) {
        var retStr = '';

        if (dataContext["d" + n] != null && dataContext["d" + n].toString().length > 0) {

//!!! А вот использование. Ну и дальше по коду кое-где.
            re.lastIndex = 0;
            var arr = re.exec(dataContext["d" + n]);
            if (arr != null) {

                if (!isNaN(parseInt(arr[1], 10)) && !isNaN(parseInt(arr[2], 10))) {

                    retStr = arr[1] + "<sub>/" + arr[2] + "</sub>";
                }
                //if (msg['MSH']['MSH.4']['MSH.4.1'] != null && msg['MSH']['MSH.4']['MSH.4.1'].toString().length > 0)
            }
        }

        return retStr;
    }

}

// Создает Элемент массива функций - Редакторов ячеек.
function createNumericRangeEditor(n) {


    return function NumericRangeEditor(args) {
        var $startTime, $LenghtTime;
        var scope = this;

        this.init = function () {
            $startTime = $("<INPUT type=text style='width:20px' />")
            .appendTo(args.container)
            .bind("keydown", scope.handleKeyDown);

            $(args.container).append("&nbsp; to &nbsp;");

            $LenghtTime = $("<INPUT type=text style='width:20px' />")
            .appendTo(args.container)
            .bind("keydown", scope.handleKeyDown);

            scope.focus();
        };

        this.handleKeyDown = function (e) {
            if (e.keyCode == $.ui.keyCode.LEFT || e.keyCode == $.ui.keyCode.RIGHT || e.keyCode == $.ui.keyCode.TAB) {
                e.stopImmediatePropagation();
            }
        };

        this.destroy = function () {
            $(args.container).empty();
        };

        this.focus = function () {
            $startTime.focus();
        };

        this.serializeValue = function () {
            var t = {}; //временная переменная для возврата объекта
            t["d" + n] = $startTime.val() + "#" + $LenghtTime.val();


            return t;
        };

        this.applyValue = function (item, state) {
            re.lastIndex = 0;
            var arr_item = re.exec(item["d" + n]);
            re.lastIndex = 0;
            var arr_state = re.exec(state["d" + n]);

            //если один из компонентов обнулился
            //    если старый - значит пришли новые данные. всё правильно
            //    если новый - нужно вызвать удаление на сервере. ///ТД не реализовано
            if (arr_item == null) {
                arr_item = [];
                arr_item[1] = "";
                arr_item[2] = "";
            }

            if (arr_state == null) {
                arr_state = [];
                arr_state[1] = "";
                arr_state[2] = "";
            }
            // проверяем что что-то изменилось и если так
            if (arr_item[1] != arr_state[1] || arr_item[2] != arr_state[2]) {
                //заполняем данные в рабочий массив из текущего состояния
                item["d" + n] = arr_state[1] + "#" + arr_state[2];


                var str = n + "/" + curMonth + "/" + curYear + " " + arr_state[1] + ":00:00";
                // refactor to UpdateServerData
                $.get("/qResult.aspx",
                { pck: "jsontest_update",
                    startd_: str,
                    endd_: arr_state[2], // item["d" + n],
                    employee_post_id_: item["employee_post_id"]
                },
                function (ret) {
                    alert("Обновлено!")
                });
            }

        };


        //Данные из ячейки массива в поля контрола редактирования значения

        this.loadValue = function (item) {
            if (item["d" + n] != null && item["d" + n].toString().lenght > 0) {
                re.lastIndex = 0;
                var arr = re.exec(item["d" + n]);
                $startTime.val(arr[1]);
                $LenghtTime.val(arr[2]);
            }


        };

        this.isValueChanged = function () {
            return args.item.startd != parseInt($startTime.val(), 10) || args.item.endd != parseInt($startTime.val(), 10);
        };

        this.validate = function () {
            if (isNaN(parseInt($startTime.val(), 10)) || isNaN(parseInt($LenghtTime.val(), 10))) {
                return { valid: false, msg: "Можно вводить только числа." };
            }

            if ((parseInt($startTime.val(), 10) + parseInt($LenghtTime.val(), 10)) > 24) {
                return { valid: false, msg: "Общая продолжительность суток не более 24 часов" };
            }

            return { valid: true, msg: null };
        };

        this.init();
    }

}

  $(function () {
      $.get("/qResult.aspx",
                { pck: "jsontest" },
                function (ret) {
                    // поиск и отображение юзверей старта.
                    //debugger;

                    var json = JSON.parse(ret);
                    if (json) {

                        var row_count = json.length;
                        var column_count = json[0].s.length;
                        var columns_names = []
                        //создание названий объектов для ассоциативного массива


                        for (var col = 0; col < column_count; col++) {
                            columns_names[col] = json[0].s[col].toLowerCase();

                        }


                        // в первой строке у нас заголовки. Загружаем всё со второй (row=1). для удаления пустой строки: data[row-1]
                        for (var row = 1; row < row_count; row++) {
                            var d = (data[row - 1] = {});
                            for (var col = 0; col < column_count; col++) {
                                d[columns_names[col]] = json[row].s[col];
                            }

                        }

                        grid = new Slick.Grid("#myGrid", data, columns, options);
                        grid.onValidationError.subscribe(function (e, args) {
                            alert(args.validationResults.msg);
                        });
                    } else {

                    }


                }
        );



  })
</script>
</body>
</html>

Ну и пример строки - это или 2#2 или 12#5 или 02#12 ну и тому подобные 2-х циферные сочетания разделённые #

melky 29.05.2012 10:23

var re = new RegExp("(\\d*)#(\\d*)", "ig");

зачем ему флаг "g" ? т.е, какие строки он обрабатывает.

B@rmaley.e><e 29.05.2012 10:32

Цитата:

Сообщение от DmitryK1
А есть другие варианты решения проблемы?

Используйте String.prototype.match

DmitryK1 19.06.2012 06:50

Цитата:

Сообщение от melky (Сообщение 177287)
var re = new RegExp("(\\d*)#(\\d*)", "ig");

зачем ему флаг "g" ? т.е, какие строки он обрабатывает.

Кстати да, это из примера взял и не убирал. Надо оба убрать, не нужны они тут.
А строки - [0-24|]#[0-24|] 0#0 0#8 4#20 # и т.п


Цитата:

Сообщение от B@rmaley.e><e (Сообщение 177288)
Используйте String.prototype.match

Интересный вариант, спасибо. Похоже именно то, что искал.


Часовой пояс GMT +3, время: 05:20.