2015-06-02 2 views
0

Я хочу установить курсор в javascript, поэтому, когда я использую регулярное выражение, он распознает, какие данные он уже проанализировал и продолжает с этой точки. Ниже приведен фрагмент кода, который показывает, что такое файл.Установка курсора регулярного выражения

# vtk DataFile Version 4.0 

-3659.0757  3746.6780  3628.1143  
-3659.6714  3746.2517  3627.9539  
-3660.1450  3745.8142  3627.9270  
-3660.4631  3745.3735  3628.0605  
-3660.6931  3745.0708  3628.1416  

LINES 207 31529 

581 0 1 2 3 4 ... 579 580 

В настоящее время я забрать float float float шаблон правильно, и я хочу, чтобы мой код, чтобы продолжать LINES 207 31529 и затем 581. Этот код поднимает LINES, но вместо перехода на 581 он возвращается в начало файла и занимает 4 для numLines.

var LINES = /(LINES)[ ]+[\d]+[ ]+[\d]+[\n]/; 
var recogLines = /[\d]+/; 
var numLines = parseInt(recogLines.exec(data)); 

Я видел что-то в Интернете о \ G, но я не думаю, что Javascript признает, что (или я просто не использовать его правильно). Как сохранить курсор, чтобы одни и те же данные повторялись снова и снова? Благодаря!

+0

JS не поддерживает '\ G'. Вам нужно совместить 'LINES 207 31529 581 '? [Что-то вроде этого?] (Https://regex101.com/r/eE3cE4/1) –

+0

Я хочу 581, но в более общем случае, поэтому без необходимости напрямую снимать LINES 207 31529. –

+0

Я не уверен, почему люди говорят, что javascript не поддерживает глобальные:/g –

ответ

0

Я хотел бы предложить что-то вдоль линий (не может быть точно синтаксически правильно):

var LINES = '/(LINES)[ ]+([\d]+)[ ]+([\d]+)\n/'; 
var data = <input>; 
var output = new Array(); 

result = LINES.exec(data); 
while(result) { 
    output.push([result[1], result[2], result[3]]); 
    result = LINES.exec(data.substring(result.index + result[0].length); 
} 

, но в тот момент, я хотел бы использовать глобальный модификатор:

var LINES = '/^(LINES)[ ]+([\d]+)[ ]+([\d]+)$/gm'; 
result = LINES.exec(data); 

даст вам массив:

array[0][2] // first LINE, first set of numbers 
array[0][3] // first LINE, second set of numbers 
array[1][2] // second LINE, first set of numbers 
array[1][3] // second LINE, second set of numbers 

Только мои 2 цента.

Edit:

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

+0

Кроме того, вы можете просто найти все ключевые слова в файле, так как он дает вам индекс соответствия, и вы будете знать, что данные следуют за ним '/^(POINTS|LINES|VERTICES|...)/gm '. Каждое совпадение даст вам индекс, а подстрока (результат [x] .index, result [x + 1] .index - result [x] .index) даст вам каждую «группу», которую вы сможете проанализировать. Выбросьте условие достижения конца совпадений (предположительно конец файла заканчивается из предыдущего совпадения). Для огромных наборов данных первый вариант по-прежнему будет лучшим. –

+0

[По ряду причин, лучше] (http://stackoverflow.com/a/6047611/778975) использовать литерал '' 'массива' 'для создания новых массивов вместо функции-конструктора' Array'. –

+0

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