повторный вызов regexp
Создаю регексп в глобальной области видимости.
var re = new RegExp("(\\d*)#(\\d*)", "ig"); Обращаюсь к нему в процедуре: var arr = re.exec(tmp); В первый раз всё работает, потом перестаёт искать. Прочитал что устанавливается переменная начала поиска в последний найденный символ (его позицию). Написал везде где вызывается так: re.lastIndex = 0; var arr = re.exec(tmp); Но как-то это не очень красиво. А есть другие варианты решения проблемы? |
DmitryK1,
Выложили б полный код и образчик строки tmp |
Хм.. Там кода много и он не нужен для вопроса, как мне казалось, но если надо, так вот:
<!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(" to "); $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-х циферные сочетания разделённые # |
var re = new RegExp("(\\d*)#(\\d*)", "ig"); зачем ему флаг "g" ? т.е, какие строки он обрабатывает. |
Цитата:
|
Цитата:
А строки - [0-24|]#[0-24|] 0#0 0#8 4#20 # и т.п Цитата:
|
Часовой пояс GMT +3, время: 16:23. |